5
我试图使用Apache Avro强制从弹性搜索导出到HDFS中很多Avro文档的数据模式(用于查询Drill)。 我遇到一些麻烦Avro的默认Avro序列化json文档缺失字段的问题
鉴于此架构:
{
"namespace" : "avrotest",
"type" : "record",
"name" : "people",
"fields" : [
{"name" : "firstname", "type" : "string"},
{"name" : "age", "type" :"int", "default": -1}
]
}
我期望如{"firstname" : "Jane"}
一个JSON文件将使用-1
的默认值的年龄字段被序列化。
默认:该字段的缺省值,读取实例 缺乏此字段(可选)时被使用。
然而,这似乎并没有发生
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)
这是可能的,还是我失去了一些东西?
在此先感谢
我有同样的问题 – imehl
呀,告诉我吧:( –
貌似在此之前提交https://github.com/apache/avro/commit/7e4037de2a891fa738aaf8a4f c56f424d6c6833a#diff-c7934590c625ba67bf1b2ad5511a4f58R97(https://issues.apache.org/jira/browse/AVRO-388)Avro GenericDatumReader能够为跳过的字段使用默认值,但不再可以这样做。 –