【问题标题】:Trouble with Avro serialization of json documents missing fieldsjson文档缺少字段的Avro序列化问题
【发布时间】: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)

这可能吗,还是我错过了什么?

【问题讨论】:

标签: hadoop serialization schema avro


【解决方案1】:

关键是,如果您在架构中这样声明您的字段:

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

使用 optional 之类的字段是不够的,尝试这样声明:

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

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多