2014-04-08 12 views
6

मैं जेसन प्रारूप में संग्रहीत डेटा के आधार पर एक एवरो डेटा फ़ाइल लिखने के लिए एक बहुत ही आसान एवरो स्कीमा लिखना चाहता हूं (आसान है क्योंकि मैं केवल अपने वर्तमान मुद्दे को इंगित कर रहा हूं)। चाल यह है कि एक क्षेत्र वैकल्पिक है, और avrotools में से एक या मैं इसे सही नहीं कर रहा है।वैकल्पिक मानों के साथ एक एवरो स्कीमा उत्पन्न करना

लक्ष्य मेरा स्वयं का धारावाहिक लिखना नहीं है, अंतराल इसे फ्लूम में रखना होगा, मैं शुरुआती चरणों में हूं।

डेटा (काम), एक फ़ाइल में so.log नामित:

{ 
    "valid": {"boolean":true} 
, "source": {"bytes":"live"} 
} 

स्कीमा, एक फ़ाइल में so.avsc नामित:

{ 
    "type":"record", 
    "name":"Event", 
    "fields":[ 
     {"name":"valid", "type": ["null", "boolean"],"default":null} 
    , {"name":"source","type": ["null", "bytes"],"default":null} 
    ] 
} 

मैं आसानी से एक एवरो फ़ाइल उत्पन्न कर सकते हैं निम्नलिखित कमांड के साथ:

java -jar avro-tools-1.7.6.jar fromjson --schema-file so.avsc so.log 

अब तक इतना अच्छा है।

{ 
    "valid": {"boolean":true} 
} 

लेकिन इसके साथ ही आदेश चलाकर मुझे त्रुटि देता है:

Exception in thread "main" org.apache.avro.AvroTypeException: Expected start-union. Got END_OBJECT 
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:229) 
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88) 
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:206) 
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) 

मैं कोशिश की थी बात यह है कि "स्रोत", वैकल्पिक है तो मैं निम्नलिखित डेटा के रूप में अच्छी तरह से मान्य होने के लिए उम्मीद करेंगे है स्कीमा में बहुत सी विविधताओं, यहां तक ​​कि चीजें जो एवरो स्पेक का पालन नहीं करती हैं। जहां तक ​​मैं जानता हूं कि स्कीमा, जहां तक ​​मुझे पता है, यह कहता है कि यह क्या होना चाहिए।

क्या कोई जानता होगा कि मैं क्या गलत कर रहा हूं, और मैं अपने स्वयं के धारावाहिक लिखने के बिना वास्तव में वैकल्पिक तत्व कैसे प्राप्त कर सकता हूं?

धन्यवाद,

+0

यहां एक ही समस्या को देखते हुए, क्या आपको एवरो को वैकल्पिक फ़ील्ड के साथ JSON रूपांतरित करने के लिए AvroTools के साथ काम करने का कोई तरीका मिला? इस समय एकमात्र कामकाज मैं सोच सकता हूं कि एक रैपर लिखना है जो रूपांतरण से पहले JSON में डिफ़ॉल्ट मान डालेगा, लेकिन यह शर्म की बात है ... – snooze92

+1

दुख की बात है कि मुझे बहुत भाग्य नहीं था। संक्षेप में JSON केवल सुविधा के लिए है, और हालांकि एक स्कीमा का डिफ़ॉल्ट मान हो सकता है, लेकिन इस मान को खोने वाला एक JSON दस्तावेज़ वास्तव में मान्य नहीं है। मैंने कुछ [समस्याओं और समाधानों को हमारे साथ एरो के साथ दस्तावेज किया] [http://thisdwhguy.com/2014/10/27/avro-end-to-end-in-hdfs-part-4-problems-and-solutions/) उम्मीद है कि यह मदद कर सकता है। – Guillaume

+0

उत्तर के लिए धन्यवाद, मैं आपके ब्लॉग लेख को पढ़ूंगा! हमने अभी जेएसओएन> एवरो रूपांतरण पर छोड़ दिया है। – snooze92

उत्तर

1

जावा एपीआई के documentation के अनुसार:

using a builder requires setting all fields, even if they are null

python API, दूसरे हाथ पर, अशक्त क्षेत्रों वास्तव में otional होने के लिए अनुमति देने के लिए लगता है:

Since the field favorite_color has type ["string", "null"], we are not required to specify this field

संक्षेप में अधिकांश उपकरण जावा लिखा जाता है, शून्य फ़ील्ड आमतौर पर स्पष्ट रूप से दिए जाने चाहिए।

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