मैं सर्वर लॉग से निपट रहा हूं जो JSON प्रारूप हैं, और मैं अपने लॉग को एडब्ल्यूएस एस 3 पर पैराक्वेट प्रारूप में स्टोर करना चाहता हूं (और पैराक्वेट को एवरो स्कीमा की आवश्यकता है)। सबसे पहले, सभी लॉगों में फ़ील्ड का एक सामान्य सेट होता है, दूसरा, सभी लॉग में बहुत सारे वैकल्पिक फ़ील्ड होते हैं जो सामान्य सेट में नहीं होते हैं।एवरो में मानचित्र के साथ रिकॉर्ड कैसे मिलाएं?
{ "ip": "172.18.80.109", "timestamp": "2015-09-17T23:00:18.313Z", "message":"blahblahblah"}
{ "ip": "172.18.80.112", "timestamp": "2015-09-17T23:00:08.297Z", "message":"blahblahblah", "microseconds": 223}
{ "ip": "172.18.80.113", "timestamp": "2015-09-17T23:00:08.299Z", "message":"blahblahblah", "thread":"http-apr-8080-exec-1147"}
तीन लॉग के सभी 3 साझा क्षेत्रों है: ip
, timestamp
और message
, लॉग में से कुछ इस तरह के microseconds
और thread
के रूप में अतिरिक्त क्षेत्रों, है
उदाहरण के लिए, follwoing तीन लॉग नहीं है।
अगर मैं निम्न स्कीमा का उपयोग तो मैं सभी अतिरिक्त फ़ील्ड .:
{"namespace": "example.avro",
"type": "record",
"name": "Log",
"fields": [
{"name": "ip", "type": "string"},
{"name": "timestamp", "type": "String"},
{"name": "message", "type": "string"}
]
}
और निम्न स्कीमा खो देंगे ठीक काम करता है:
{"namespace": "example.avro",
"type": "record",
"name": "Log",
"fields": [
{"name": "ip", "type": "string"},
{"name": "timestamp", "type": "String"},
{"name": "message", "type": "string"},
{"name": "microseconds", "type": [null,long]},
{"name": "thread", "type": [null,string]}
]
}
लेकिन केवल समस्या यह है कि मैं नहीं है वैकल्पिक फ़ील्ड के सभी नामों को तब तक जानें जब तक कि मैं सभी लॉग स्कैन नहीं करता, इसके अलावा, भविष्य में नए अतिरिक्त फ़ील्ड भी होंगे।
तो मैं एक विचार है कि record
और map
को जोड़ती है बाहर लगता है:
{"namespace": "example.avro",
"type": "record",
"name": "Log",
"fields": [
{"name": "ip", "type": "string"},
{"name": "timestamp", "type": "String"},
{"name": "message", "type": "string"},
{"type": "map", "values": "string"} // error
]
}
दुर्भाग्य से यह संकलन नहीं होगा:
Exception in thread "main" org.apache.avro.SchemaParseException: No field name: {"type":"map","values":"long"}
at org.apache.avro.Schema.getRequiredText(Schema.java:1305)
at org.apache.avro.Schema.parse(Schema.java:1192)
at org.apache.avro.Schema$Parser.parse(Schema.java:965)
at org.apache.avro.Schema$Parser.parse(Schema.java:932)
at org.apache.avro.tool.SpecificCompilerTool.run(SpecificCompilerTool.java:73)
at org.apache.avro.tool.Main.run(Main.java:84)
at org.apache.avro.tool.Main.main(Main.java:73)
:
java -jar avro-tools-1.7.7.jar compile schema example.avro .
यह एक त्रुटि बाहर फेंक होगा
क्या एवरो प्रारूप में जेएसओएन तारों को स्टोर करने का कोई तरीका है जो flexib हैं अज्ञात वैकल्पिक क्षेत्रों से निपटने के लिए le?
असल में यह स्कीमा विकास समस्या है, स्पार्क Schema Merging द्वारा इस समस्या से निपट सकता है। मैं हडोप के साथ एक समाधान की तलाश में हूं।
आपके मानचित्र का कोई नाम विशेषता नहीं है। इसे एक दें। :) – oakad
मुझे लगता है कि आप कभी भी एरो का प्रयास नहीं करते हैं। यह काम नहीं करेगा। '{" नेमस्पेस ":" example.avro ", " टाइप ":" रिकॉर्ड ", " नाम ":" लॉग ", " फ़ील्ड ": [ {" name ":" ip "," type ": "स्ट्रिंग"}, {"name": "टाइमस्टैम्प", "टाइप": "स्ट्रिंग"}, {"name": "message", "type": "string"}, {"name": " addtional "," प्रकार ":" मानचित्र "," मान ":" स्ट्रिंग "} ] }' – soulmachine