【发布时间】:2016-06-17 03:09:38
【问题描述】:
我正在尝试使用 Apache Avro 对从 Elastic Search 导出到 HDFS 中的许多 Avro 文档中的数据强制实施模式(使用 Drill 进行查询)。我在使用 Avro 默认设置时遇到了一些问题
鉴于此架构:
{
"namespace" : "avrotest",
"type" : "record",
"name" : "people",
"fields" : [
{"name" : "firstname", "type" : "string"},
{"name" : "age", "type" :"int", "default": -1}
]
}
我希望像 {"firstname" : "Jane"}
这样的 json 文档将使用年龄字段的默认值 -1 进行序列化。
default:该字段的默认值,在读取实例时使用 缺少此字段(可选)。
然而,这似乎并没有发生
java -jar avro-tools-1.8.0.jar fromjson --schema-file p2.avsc jane.json > jane.avro
Exception in thread "main" org.apache.avro.AvroTypeException: Expected int. Got END_OBJECT
at org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:697)
at org.apache.avro.io.JsonDecoder.readInt(JsonDecoder.java:172)
at org.apache.avro.io.ValidatingDecoder.readInt(ValidatingDecoder.java:83)
at org.apache.avro.generic.GenericDatumReader.readInt(GenericDatumReader.java:511)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:182)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152)
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:240)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:230)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:174)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:144)
at org.apache.avro.tool.DataFileWriteTool.run(DataFileWriteTool.java:99)
at org.apache.avro.tool.Main.run(Main.java:87)
at org.apache.avro.tool.Main.main(Main.java:76)
这可能吗,还是我错过了什么?
【问题讨论】:
-
我也有同样的问题
-
是的,告诉我吧:(
-
看起来在此提交之前github.com/apache/avro/commit/… (issues.apache.org/jira/browse/AVRO-388) Avro GenericDatumReader 能够对跳过的字段使用默认值,但现在不能这样做了。
标签: hadoop serialization schema avro