2016-11-03 16 views
5

का उपयोग कर रिकॉर्ड में फ़ील्ड छोड़ना अद्यतन: स्पार्क-एवरो पैकेज इस परिदृश्य का समर्थन करने के लिए अपडेट किया गया था। https://github.com/databricks/spark-avro/releases/tag/v3.1.0स्पार्क-एवरो

मेरे पास एक एवीआरओ फ़ाइल है जो मेरे नियंत्रण के बाहर किसी तीसरे पक्ष द्वारा बनाई गई थी, जिसे मुझे स्पार्क का उपयोग करके संसाधित करने की आवश्यकता है।

{  
    "name" : "Properties",        
    "type" : {           
    "type" : "map",         
    "values" : [ "long", "double", "string", "bytes" ] 
}             

यह spark-avro रीडर के साथ असमर्थित है:: एवरो स्कीमा एक रिकार्ड क्षेत्रों में से एक एक मिश्रित संघ होता है, जहां है

ऊपर सूचीबद्ध प्रकार के अलावा, यह पढ़ने का समर्थन करता है तीन प्रकार के यूनियन प्रकारों में से: यूनियन (int, long) यूनियन (फ्लोट, डबल) यूनियन (कुछ, शून्य), जहां ऊपर सूचीबद्ध समर्थित एवरो प्रकारों में से एक है या समर्थित यूनियन प्रकारों में से एक है।

एवीआरओ के स्कीमा विकास और संकल्प के बारे में पढ़ना, मैं इस क्षेत्र को छोड़ने वाली एक अलग पाठक स्कीमा निर्दिष्ट करके समस्याग्रस्त क्षेत्र को छोड़कर फ़ाइल को पढ़ने में सक्षम होने की उम्मीद करता हूं। AVRO Schema Resolution docs के अनुसार, यह काम करना चाहिए:

यदि लेखक का रिकॉर्ड एक नाम पाठक का रिकॉर्ड में मौजूद नहीं के साथ एक क्षेत्र शामिल हैं, उस क्षेत्र के लिए लेखक के मूल्य को नजरअंदाज कर दिया जाता है।

तो मैं

val df = sqlContext.read.option("avroSchema", avroSchema).avro(path) 

कहाँ avroSchema ठीक उसी स्कीमा, लेखक का इस्तेमाल किया है, लेकिन समस्या पैदा करने वाले क्षेत्र के बिना उपयोग कर संशोधित।

लेकिन फिर भी मुझे मिश्रित संघ प्रकारों के बारे में एक ही त्रुटि मिलती है।

क्या स्कीमा विकास का यह परिदृश्य AVRO के साथ समर्थित है? एवरो-स्पार्क के साथ? क्या मेरा लक्ष्य हासिल करने का कोई और तरीका है?


अद्यतन: मैं अपाचे एवरो 1.8.1 के साथ एक ही परिदृश्य (एक ही फाइल वास्तव में) का परीक्षण किया है और यह उम्मीद के रूप में काम करता है। फिर यह विशेष रूप से spark-avro के साथ होना चाहिए। कोई विचार?

+0

कोई जवाब नहीं है लेकिन ऐसा लगता है कि 'स्पार्क-एवरो' एवीआरओ स्कीमा विकास \ संकल्प नियमों का पालन नहीं करता है। देखें: https://github.com/databricks/spark-avro/issues/176 https: // github।कॉम/डाटाबेस/स्पार्क-एवरो/ब्लॉब/मास्टर/src/main/scala/com/databricks/स्पार्क/एवरो/DefaultSource.scala # L61 – itaysk

+0

मैंने एक बक्षीस पोस्ट किया लेकिन यह बहुत अच्छा होगा अगर आप जो भी जानते हैं उसे पोस्ट करें अगर कोई समाधान के साथ आता है तो जवाब दें। –

+0

मुझे जो मिला वह यह था कि स्पार्क-एवरो का उपयोग करके यह नहीं किया जा सकता है। इसके बजाय मैं एवरो के मानक एपीआई का उपयोग करता हूं। मैंने जवाब के रूप में पोस्ट नहीं किया क्योंकि यह मूल प्रश्न हल नहीं करता है, लेकिन एक अलग समाधान का प्रस्ताव करता है। क्या आपको लगता है कि कोड को उत्तर के रूप में पोस्ट करना फायदेमंद है? – itaysk

उत्तर

5

अद्यतन: स्पार्क-एवरो पैकेज इस परिदृश्य का समर्थन करने के लिए अद्यतन किया गया था। https://github.com/databricks/spark-avro/releases/tag/v3.1.0

यह वास्तव में एक ही समस्या के लिए एक अलग समाधान के बजाय मेरे प्रश्न का उत्तर नहीं देता है।

चूंकि वर्तमान में स्पार्क-एवरो में यह कार्यक्षमता नहीं है (प्रश्न के लिए मेरी टिप्पणी देखें) - मैंने इसके बजाय एवरो org.apache.avro.mapreduce और स्पार्क के newAPIHadoopFile का उपयोग किया है।

val path = "..." 
val conf = new SparkConf().setAppName("avro test") 
    .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
val sc = new SparkContext(conf) 

val avroRdd = sc.newAPIHadoopFile(path, 
    classOf[AvroKeyInputFormat[GenericRecord]], 
    classOf[AvroKey[GenericRecord]], 
    classOf[NullWritable]) 

इसके विपरीत चिंगारी-एवरो करने, सरकारी एवरो libs मिश्रित संघ प्रकार और स्कीमा विकास का समर्थन करता है: यहाँ इस बात का एक सरल उदाहरण है।

+1

एक बार फिर, पोस्ट करने के लिए धन्यवाद :) –