मैं जेसन प्रारूप में संग्रहीत डेटा के आधार पर एक एवरो डेटा फ़ाइल लिखने के लिए एक बहुत ही आसान एवरो स्कीमा लिखना चाहता हूं (आसान है क्योंकि मैं केवल अपने वर्तमान मुद्दे को इंगित कर रहा हूं)। चाल यह है कि एक क्षेत्र वैकल्पिक है, और 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)
मैं कोशिश की थी बात यह है कि "स्रोत", वैकल्पिक है तो मैं निम्नलिखित डेटा के रूप में अच्छी तरह से मान्य होने के लिए उम्मीद करेंगे है स्कीमा में बहुत सी विविधताओं, यहां तक कि चीजें जो एवरो स्पेक का पालन नहीं करती हैं। जहां तक मैं जानता हूं कि स्कीमा, जहां तक मुझे पता है, यह कहता है कि यह क्या होना चाहिए।
क्या कोई जानता होगा कि मैं क्या गलत कर रहा हूं, और मैं अपने स्वयं के धारावाहिक लिखने के बिना वास्तव में वैकल्पिक तत्व कैसे प्राप्त कर सकता हूं?
धन्यवाद,
यहां एक ही समस्या को देखते हुए, क्या आपको एवरो को वैकल्पिक फ़ील्ड के साथ JSON रूपांतरित करने के लिए AvroTools के साथ काम करने का कोई तरीका मिला? इस समय एकमात्र कामकाज मैं सोच सकता हूं कि एक रैपर लिखना है जो रूपांतरण से पहले JSON में डिफ़ॉल्ट मान डालेगा, लेकिन यह शर्म की बात है ... – snooze92
दुख की बात है कि मुझे बहुत भाग्य नहीं था। संक्षेप में JSON केवल सुविधा के लिए है, और हालांकि एक स्कीमा का डिफ़ॉल्ट मान हो सकता है, लेकिन इस मान को खोने वाला एक JSON दस्तावेज़ वास्तव में मान्य नहीं है। मैंने कुछ [समस्याओं और समाधानों को हमारे साथ एरो के साथ दस्तावेज किया] [http://thisdwhguy.com/2014/10/27/avro-end-to-end-in-hdfs-part-4-problems-and-solutions/) उम्मीद है कि यह मदद कर सकता है। – Guillaume
उत्तर के लिए धन्यवाद, मैं आपके ब्लॉग लेख को पढ़ूंगा! हमने अभी जेएसओएन> एवरो रूपांतरण पर छोड़ दिया है। – snooze92