2014-12-15 5 views
9

मैं एक एवरो स्कीमा का उपयोग कर एक JSON फ़ाइल को सत्यापित करने और संबंधित एवरो फ़ाइल लिखने की कोशिश कर रहा हूं। सबसे पहले, मैं परिभाषित किया है निम्नलिखित एवरो स्कीमा user.avsc नामित:अपेक्षित स्टार्ट-यूनियन को कैसे ठीक करें। कमांड लाइन पर JSON से एवरो को परिवर्तित करते समय VALUE_NUMBER_INT मिला?

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

फिर एक user.json फ़ाइल बनाई:

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

और फिर भागने की कोशिश की:

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

लेकिन मैं मिलता है निम्नलिखित अपवाद:

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) 

क्या मुझे कुछ याद आ रही है? मुझे "अपेक्षित स्टार्ट-यूनियन क्यों मिला। VALUE_NUMBER_INT मिला"।

उत्तर

16

the explanation by Doug Cutting के अनुसार,

एवरो के JSON एन्कोडिंग की आवश्यकता है गैर-शून्य संघ मूल्यों अपने इच्छित प्रकार के साथ टैग किया कि । ऐसा इसलिए है क्योंकि ["बाइट्स", "स्ट्रिंग"] और ["int", "long"] जैसे यूनियन JSON में संदिग्ध हैं, पहले दोनों JSON तारों के रूप में एन्कोड किए गए हैं, जबकि दूसरा दोनों JSON संख्याओं के रूप में एन्कोड किए गए हैं ।

:

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

अंतर्दृष्टि के लिए धन्यवाद। @Ppearcy –

6

काम करता है में एक नया JSON एनकोडर कि इस आम मुद्दे के समाधान करना चाहिए है:

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

इस प्रकार अपने रिकॉर्ड के रूप में एन्कोड किया जाना चाहिए https://issues.apache.org/jira/browse/AVRO-1582

https://github.com/zolyfarkas/avro

+0

ग्रेट द्वारा उल्लिखित एवीआरओ -1582 के लिए तत्पर हैं! :) सूचित करने के लिए धन्यवाद। –

संबंधित मुद्दे