2015-05-01 6 views
7

आरडीडी परिवर्तन और क्रियाएं केवल चालकों द्वारा ही लागू की जा सकती हैं, अन्य परिवर्तनों के अंदर नहीं; उदाहरण के लिए, rdd1.map (x => rdd2.values.count() * x) अमान्य है क्योंकि मान परिवर्तन और गिनती कार्रवाई rdd1.map परिवर्तन के अंदर निष्पादित नहीं की जा सकती है। अधिक जानकारी के लिए, स्पार्क -5063 देखें।नेस्टेड मानचित्र कार्यों में SPARK-5063 को हल करने के लिए कैसे करें

जैसा कि त्रुटि कहती है, मैं मुख्य मानचित्र फ़ंक्शन के भीतर जावाआरडीडी ऑब्जेक्ट को मानचित्र (रूपांतरण) करने की कोशिश कर रहा हूं, अपाचे स्पार्क के साथ यह कैसे संभव है?

मुख्य JavaPairRDD वस्तु (textfile और वर्ड परिभाषित कर रहे हैं वर्ग):

JavaPairRDD<TextFile, JavaRDD<Word>> filesWithWords = new... 

और नक्शा समारोह:

filesWithWords.map(textFileJavaRDDTuple2 -> textFileJavaRDDTuple2._2().map(word -> new Word(word.getText(), (long) textFileJavaRDDTuple2._1().getText().split(word.getText()).length))); 

भी मैं foreach बजाय समारोह के नक्शे कोशिश की, लेकिन काम नहीं कर रहा। (और निश्चित रूप से स्पार्क -5063 की खोज की गई)

+0

यह भी देखें: http://stackoverflow.com/questions/29815878/how-to-deal-with-error-spark-5063-in-spark – maasg

उत्तर

8

उसी तरह आरडीडी पर नेस्टेड ऑपरेशंस समर्थित नहीं हैं, स्पार्क में घोंसला वाले आरडीडी प्रकार संभव नहीं हैं। आरडीडी को केवल ड्राइवर में परिभाषित किया जाता है, जहां उनके SparkContext के संयोजन में वे अपने द्वारा प्रदर्शित डेटा पर संचालन निर्धारित कर सकते हैं।

तो, मूल कारण हम इस मामले में पता करने के लिए की जरूरत है डेटाप्रकार है:

JavaPairRDD<TextFile, JavaRDD<Word>> filesWithWords 

कौन सा स्पार्क में कोई संभव वैध उपयोग करना होगा। USECASE है, जो आगे सवाल में नहीं समझाया गया है के आधार पर, इस प्रकार से एक हो जाना चाहिए:

RDDs का एक संग्रह, पाठ फ़ाइल के साथ वे का संदर्भ लें:

या का एक संग्रह (textfile, वर्ड) पाठ फ़ाइल द्वारा:

JavaPairRDD<TextFile, Word> 

या उनकी संगत textfile साथ शब्दों का एक संग्रह:

JavaPairRDD<TextFile, List<Word>> 

एक बार टाइप सही होने के बाद, नेस्टेड आरडीडी संचालन के साथ मुद्दों को स्वाभाविक रूप से हल किया जाएगा।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैंने इस तरह के मानचित्र का उपयोग करने की कोशिश की: मानचित्र <टेक्स्टफ़ाइल, जावाआरडीडी > textMap = filesWithWords.collectAsMap(); textMap.forEach ((textFile, wordJavaRDD) -> wordJavaRDD.map (शब्द ->/* कुछ परिवर्तन * /)); लेकिन फिर से एक ही त्रुटि देता है। –

+0

@Alp 'collectAsMap() 'आपको' मानचित्र <टेक्स्टफाइल, जावाआरडीडी >' वापस नहीं देगा। आप बीटीडब्ल्यू करने की कोशिश कर रहे हैं? मेरे लिए, ऐसा लगता है कि जिस निर्माण का आप प्रयास कर रहे हैं वह बदले में है। – maasg

+0

'collectAsMap()' नक्शा देता है ('java.util.Map'), मैंने इसे चेक किया है। मुझे लगता है कि तुम्हारा मतलब है 'scala.collection.Map'? _TextFile_ कक्षा में किसी भी फ़ाइल के _Path_ और _Text_ गुण हैं, _Word_ कक्षा में _word_ और इसकी _count_ है और मैं वर्तमान शब्द फ़ाइल में प्रत्येक शब्द को गिनने की कोशिश कर रहा हूं। इसके अलावा 'JavaRDD ' में सभी शब्द हैं जो सभी टेक्स्ट फ़ाइलों में उपयोग नहीं करते हैं, न केवल वर्तमान फ़ाइल, इसलिए मैं सरल शब्द का उपयोग नहीं कर सकता उदाहरण उदाहरण –

3

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

0

@maasg सबसे पहले मैं JavaPairRDD < textfile, JavaRDD < वर्ड>> इस्तेमाल किया है, और यह काम नहीं किया, जैसा कि आप और @ दाऊद ग्रिफिन ने कहा, यह अभी तक संभव नहीं है। मॉडल:

textfile (स्ट्रिंग पथ, स्ट्रिंग पाठ)

वर्ड (स्ट्रिंग शब्द, पूर्णांक गिनती)

अब

JavaRDD < का उपयोग कर textfile> और मॉडल के रूप में बदल दिया है:

टेक्स्टफाइल (स्ट्रिंग पथ, स्ट्रिंग टेक्स्ट, सूची < शब्द> शब्दसूची)

वर्ड (स्ट्रिंग शब्द, पूर्णांक गिनती)

अंत में,

List<Word> countDrafts = wordCount.map(v11 -> new Word(v11._1(), (long) 0)).collect(); 
JavaRDD<TextFile> ft = fileTexts.map(v11 -> new TextFile(v11._1(), v11._2(), countDrafts)); 
ft.foreach(textFile -> textFile.getWordList().forEach(word -> new Word(word.getText(), getWordCountFromText(textFile.getText(), word.getText())))); 

getWordCountFromText() समारोह textfile वस्तु के पाठ में शब्द मायने रखता है, लेकिन का उपयोग नहीं कर चिंगारी दुर्भाग्य विधि को कम करने, का उपयोग करते हुए क्लासिक तरीका।

वैसे, मैं अगले दिनों में डेटाफ्रेम का प्रयास करूंगा, लेकिन मेरे पास ऐसा करने में कम समय है।

सभी को धन्यवाद।

+0

मास और डेविड के उत्तरों का जवाब देने के उत्तर लिखने के बजाय, आप उपरोक्त जानकारी के साथ अपनी पोस्ट संपादित करना और इस उत्तर को हटाना चाहते हैं। –

+0

@MikelUrkia http://stackoverflow.com/questions/29996427/how-to-solve-spark-5063-in-nested-map-functions/30029550?noredirect=1#comment48127506_30000494 –

+0

क्या @maasg कहता है कि आप चाहें एक नया ** प्रश्न ** लिखने के लिए - आपके मौजूदा प्रश्न का उत्तर नहीं - जिस कोड को आप कोशिश कर रहे हैं, मुख्य रूप से क्योंकि आपके उत्तर पर * नई * समस्या जिसे आपने पहचाना है, वह इस प्रश्न में पोस्ट किए गए जैसा नहीं है। इस तरह आपके * नए * प्रश्न का उत्तर देना आसान होगा। –

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