在 avro 文件中存储空值
Storing null values in avro files
我有一些 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 文件时,出现空指针异常。
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;
为了能够将 Avro 字段设置为 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
字段设置为空。由于对比 userId
只能包含长值,因此尝试将 userId
设置为 null 将导致 NullPointerException
.
我也有这个问题,现在已经解决了。
我在 Apache Avro 中找到了 @Nullable
注释来声明该字段可以为空。
所以,在这个例子中,我们应该
import org.apache.avro.reflect.Nullable;
public class MyAvroRecord {
long id;
String name;
String type;
Date timestamp;
Date lastModifcationDate;
String lastModifiedUsername;
@Nullable
Boolean lockedQuery;
}
我有一些 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 文件时,出现空指针异常。
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;
为了能够将 Avro 字段设置为 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
字段设置为空。由于对比 userId
只能包含长值,因此尝试将 userId
设置为 null 将导致 NullPointerException
.
我也有这个问题,现在已经解决了。
我在 Apache Avro 中找到了 @Nullable
注释来声明该字段可以为空。
所以,在这个例子中,我们应该
import org.apache.avro.reflect.Nullable;
public class MyAvroRecord {
long id;
String name;
String type;
Date timestamp;
Date lastModifcationDate;
String lastModifiedUsername;
@Nullable
Boolean lockedQuery;
}