2014-12-15 2 views
9

Ich versuche, eine JSON-Datei mithilfe eines Avro-Schemas zu validieren und die entsprechende Avro-Datei zu schreiben. Zuerst habe ich folgendes Schema Avro user.avsc genannt definiert:So beheben Sie die erwartete Start-Union. Haben Sie VALUE_NUMBER_INT beim Konvertieren von JSON in Avro in der Befehlszeile erhalten?

{"namespace": "example.avro", 
"type": "record", 
"name": "user", 
"fields": [ 
    {"name": "name", "type": "string"}, 
    {"name": "favorite_number", "type": ["int", "null"]}, 
    {"name": "favorite_color", "type": ["string", "null"]} 
] 
} 

Dann eine user.json Datei erstellt:

{"name": "Alyssa", "favorite_number": 256, "favorite_color": null} 

und versuchte dann zu laufen:

java -jar ~/bin/avro-tools-1.7.7.jar fromjson --schema-file user.avsc user.json > user.avro 

Aber ich bekomme die folgende Ausnahme:

Exception in thread "main" org.apache.avro.AvroTypeException: Expected start-union. Got VALUE_NUMBER_INT 
    at org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:697) 
    at org.apache.avro.io.JsonDecoder.readIndex(JsonDecoder.java:441) 
    at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290) 
    at org.apache.avro.io.parsing.Parser.advance(Parser.java:88) 
    at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267) 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155) 
    at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193) 
    at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183) 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151) 
    at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142) 
    at org.apache.avro.tool.DataFileWriteTool.run(DataFileWriteTool.java:99) 
    at org.apache.avro.tool.Main.run(Main.java:84) 
    at org.apache.avro.tool.Main.main(Main.java:73) 

Fehle ich etwas? Warum bekomme ich "Expected start-union. Got VALUE_NUMBER_INT".

Antwort

16

Nach the explanation by Doug Cutting,

Avro JSON-Codierung erfordert, dass Nicht-Null-Werte der Union mit ihrer beabsichtigten Art markiert werden. Dies liegt daran, dass Unionen wie ["Bytes", "String"] und ["Int", "long"] in JSON nicht eindeutig sind, die ersten sind beide als JSON-Strings codiert, während die zweiten beide als JSON-Nummern codiert sind .

http://avro.apache.org/docs/current/spec.html#json_encoding

So wird Ihr Datensatz muss codiert werden als:

{"name": "Alyssa", "favorite_number": {"int": 7}, "favorite_color": null} 
+1

Danke für die Einblicke. Ich freue mich auf AVRO-1582 wie erwähnt von @ppearcy –

Verwandte Themen