2016-03-03 8 views
5

私はApache Searchを使用して、Elastic SearchからエクスポートされたデータのスキーマをHDFS内の多くのAvroドキュメントに適用しようとしています。 私はこのスキーマを考えるとアブロデフォルトjsonドキュメントのAvroシリアル化で問題が発生しました

といくつかの問題を抱えている:

{  
    "namespace" : "avrotest",  
    "type" : "record",  
    "name" : "people",                         
    "fields" : [                           
    {"name" : "firstname", "type" : "string"},                   
    {"name" : "age", "type" :"int", "default": -1}                  
    ]                              
} 

私はJSONドキュメントなど{"firstname" : "Jane"} は、年齢フィールドに-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 } 
関連する問題