2014-04-30 20 views
12

के अंदर संग्रह संशोधित करें मैं आरडीडी के तत्वों को पुन: सक्रिय करते समय मानचित्र में तत्व जोड़ने की कोशिश कर रहा हूं। मुझे कोई त्रुटि नहीं मिल रही है, लेकिन संशोधन नहीं हो रहे हैं।स्पार्क आरडीडी फोरैच

यह सब ठीक काम करता है सीधे जोड़ने या अन्य संग्रह पुनरावृत्ति:

scala> val myMap = new collection.mutable.HashMap[String,String] 
myMap: scala.collection.mutable.HashMap[String,String] = Map() 

scala> myMap("test1")="test1" 

scala> myMap 
res44: scala.collection.mutable.HashMap[String,String] = Map(test1 -> test1) 

scala> List("test2", "test3").foreach(w => myMap(w) = w) 

scala> myMap 
res46: scala.collection.mutable.HashMap[String,String] = Map(test2 -> test2, test1 -> test1, test3 -> test3) 

लेकिन जब मैं एक RDD से भी ऐसा ही करने की कोशिश: मैं की सामग्री मुद्रण की कोशिश की है

scala> val fromFile = sc.textFile("tests.txt") 
... 
scala> fromFile.take(3) 
... 
res48: Array[String] = Array(test4, test5, test6) 

scala> fromFile.foreach(w => myMap(w) = w) 
scala> myMap 
res50: scala.collection.mutable.HashMap[String,String] = Map(test2 -> test2, test1 -> test1, test3 -> test3) 

नक्शा यह सुनिश्चित करने के लिए था कि चर वैसा ही है, और यह सही ढंग से प्रिंट करता है:

fromFile.foreach(w => println(myMap("test1"))) 
... 
test1 
test1 
test1 
... 

मैंने फ़ोरैच कोड के अंदर मानचित्र के संशोधित तत्व को भी मुद्रित किया है और यह संशोधित के रूप में प्रिंट करता है, लेकिन जब ऑपरेशन पूरा हो जाता है, तो नक्शा असम्बद्ध लगता है।

scala> fromFile.foreach({w => myMap(w) = w; println(myMap(w))}) 
... 
test4 
test5 
test6 
... 
scala> myMap 
res55: scala.collection.mutable.HashMap[String,String] = Map(test2 -> test2, test1 -> test1, test3 -> test3) 

एक सरणी (इकट्ठा) को RDD परिवर्तित भी ठीक काम करता है:

fromFile.collect.foreach(w => myMap(w) = w) 
scala> myMap 
res89: scala.collection.mutable.HashMap[String,String] = Map(test2 -> test2, test5 -> test5, test1 -> test1, test4 -> test4, test6 -> test6, test3 -> test3) 

यह एक संदर्भ समस्या है? क्या मैं उस डेटा की एक प्रति एक्सेस कर रहा हूं जिसे कहीं और संशोधित किया जा रहा है?

उत्तर

30

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

मुझे लगता है कि यह आपके प्रश्न का उत्तर देता है, लेकिन जाहिर है कि आप कुछ हासिल करने की कोशिश कर रहे हैं और आप इस तरह से वहां नहीं पहुंच पाएंगे। यहां व्याख्या करने के लिए स्वतंत्र महसूस करें या एक अलग प्रश्न में आप क्या करने की कोशिश कर रहे हैं, और मैं मदद करने की कोशिश करूंगा।

+0

यह वास्तव में मेरे प्रश्न का उत्तर देता है, और जो मैं पूरा करने की कोशिश कर रहा था उसके बारे में चिंता न करें, मुझे अभी यह एक दिलचस्प मामला मिला है जिसके लिए मुझे कोई स्पष्टीकरण नहीं मिला है। मैं अब कर रहा हूँ, धन्यवाद! – palako

+3

हां, जैसा कि डैनियल बताता है कि आप राज्य को विचलित नहीं कर सकते हैं, palako कार्यात्मक प्रोग्रामिंग के बिंदु गुम है। आप को राज्य को उत्परिवर्तित नहीं करना चाहिए, तब आप parallerize नहीं कर सकते हैं। इस तरह से कोड को डिज़ाइन करके कि आप राज्य को म्यूटेट नहीं करते हैं, आपका कोड मुफ्त में पैरालेरिज कर सकता है और आप क्लस्टर में वितरित करने के लिए स्पार्क और स्काल्डिंग जैसे ढांचे का उपयोग कर सकते हैं। – samthebest

+0

@Daniel क्या इसके लिए कोई कामकाज है? –

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