2016-03-03 98 views
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) 

这是可能的,还是我失去了一些东西?

在此先感谢

+0

我有同样的问题 – imehl

+0

呀,告诉我吧:( –

+0

貌似在此之前提交https://github.com/apache/avro/commit/7e4037de2a891fa738aaf8a4f c56f424d6c6833a#diff-c7934590c625ba67bf1b2ad5511a4f58R97(https://issues.apache.org/jira/browse/AVRO-388)Avro GenericDatumReader能够为跳过的字段使用默认值,但不再可以这样做。 –

回答

0

的一点是,如果你在架构中这样声明你的领域:

{"name": "fieldName", "type": ["int", "null"], default: null } 

这是不够的使用领域一样可选,尝试声明这样说:

{"name": "fieldName", "type": ["null", "int"], default: null }