Хранение нулевых значений в файлах avro
У меня есть некоторые данные json, которые выглядят следующим образом:
{
"id": 1998983092,
"name": "Test Name 1",
"type": "search string",
"creationDate": "2017-06-06T13:49:15.091+0000",
"lastModificationDate": "2017-06-28T14:53:19.698+0000",
"lastModifiedUsername": "testuser@test.com",
"lockedQuery": false,
"lockedByUsername": null
}
Я могу добавить нулевое значение lockedQuery к объекту GenericRecord без проблем.
GenericRecord record = new GenericData.Record(schema);
if(json.isNull("lockedQuery")){
record.put("lockedQuery", null);
}
Однако позже, когда я пытаюсь записать этот объект GenericRecord в файл avro, я получаю исключение null-указателя.
File file = new File("~/test.arvo");
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(schema);
DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(datumWriter);
dataFileWriter.create(schema, file);
for(GenericRecord record: masterList) {
dataFileWriter.append(record); // NULL POINTER HERE
}
Когда я запускаю этот код, я получаю следующее исключение. Любые советы о том, как обработать нулевое значение в файл Avro, очень ценятся. Заранее спасибо.
java.lang.NullPointerException: null of boolean in field lockedQuery of
com.mydomain.test1.domain.MyAvroRecord
Exception in thread "main" java.lang.RuntimeException:
org.apache.avro.file.DataFileWriter$AppendWriteException:
java.lang.NullPointerException: null of boolean in field lockedQuery of
com.mydomain.test1.domain.MyAvroRecord
at com.mydomain.avro.App.main(App.java:198)
Caused by: org.apache.avro.file.DataFileWriter$AppendWriteException:
java.lang.NullPointerException: null of boolean in field lockedQuery of
com.mydomain.test1.domain.MyAvroRecord
at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:308)
Правка: вот MyAvroRecord
public class MyAvroRecord {
long id;
String name;
String type;
Date timestamp;
Date lastModifcationDate;
String lastModifiedUsername;
Boolean lockedQuery;
1 ответ:
Чтобы иметь возможность установить Avro field в
null
, Вы должны разрешить это в схеме Avro, добавивnull
в качестве одного из возможных типов поля. Взгляните на пример из документации Avro:{ "type": "record", "name": "MyRecord", "fields" : [ {"name": "userId", "type": "long"}, // mandatory field {"name": "userName", "type": ["null", "string"]} // optional field ] }
Здесь
userName
объявляется составным типом, который может быть либоnull
, либоstring
. Этот вид определения позволяет установить полеuserName
в null. Поскольку contrastuserId
может содержать только длинные значения, следовательно, попытка установитьuserId
в null приведет кNullPointerException
.