2014-12-15 9 views
9

Próbuję sprawdzić poprawność pliku JSON przy użyciu schematu Avro i napisać odpowiedni plik Avro. Po pierwsze, mam następujący schemat zdefiniowany Avro nazwie user.avsc:Jak naprawić oczekiwany start-union. Mam VALUE_NUMBER_INT podczas konwersji JSON do Avro w wierszu poleceń?

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

Następnie stworzył user.json plik:

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

A potem próbował uruchomić:

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

ale pojawia się następujący wyjątek:

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) 

Czy czegoś brakuje? Dlaczego otrzymuję komunikat "Oczekiwany związek początkowy. Mam VALUE_NUMBER_INT".

Odpowiedz

16

Według the explanation by Doug Cutting,

kodowania JSON avro wymaga że nie wartości zerowe są znakowane związków z ich przeznaczeniem typu. Dzieje się tak, ponieważ związki takie jak ["bajtów", "ciąg"] i ["int", "long"] są niejednoznaczne w JSON, pierwsze są kodowane jako ciągi JSON, podczas gdy drugie są kodowane jako numery JSON .

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

Zatem Twój rekord musi być zakodowany jako:

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

Dzięki za spostrzeżenia. Czekamy na AVRO-1582 jak wspomniano przez @ppearcy –