मुझे RDD
में reduce
जैसे प्रदर्शन की आवश्यकता है, लेकिन ऑपरेटर को कम्यूटिव होने की आवश्यकता नहीं है। यानी मैं चाहता हूं कि result
अनुवर्ती में हमेशा "123456789"
होगा।क्या आरडीडी में कोई कार्रवाई ऑर्डर रखती है?
scala> val rdd = sc.parallelize(1 to 9 map (_.toString))
rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[24] at parallelize at <console>:24
scala> val result = rdd.someAction{ _+_ }
सबसे पहले, मुझे fold
मिला। RDD#fold
के दस्तावेज़ का कहना है:
डीईएफ़ गुना (zeroValue: टी) (सेशन: (टी, टी) ⇒ टी): टी सकल सभी विभाजनों के लिए के तत्वों प्रत्येक विभाजन, और उसके बाद परिणाम, का उपयोग करते हुए एक दिया साहचर्य समारोह और एक तटस्थ "शून्य मान"
नोट है कि वहाँ कोई विनिमेय दस्तावेज़ में की जरूरत है। हालांकि, परिणाम की उम्मीद नहीं है के रूप में:
scala> rdd.fold(""){ _+_ }
res10: String = 312456879
संपादित के रूप में @ dk14 ने उल्लेख मैं कोशिश की है, कोई भाग्य के साथ:
scala> val rdd = sc.parallelize(1 to 9 map (_.toString))
rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[48] at parallelize at <console>:24
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res22: String = 341276895
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res23: String = 914856273
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res24: String = 742539618
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res25: String = 271468359
आप दस्तावेज़ों के अगले खंड को याद करते हैं, जो आप देख रहे हैं: * "यह स्कैला जैसी कार्यात्मक भाषाओं में गैर-वितरित संग्रह के लिए लागू फ़ोल्ड ऑपरेशंस से कुछ अलग तरीके से व्यवहार करता है। यह फोल्ड ऑपरेशन लागू हो सकता है विभाजन अलग-अलग होते हैं, और फिर उन परिणामों को अंतिम परिणाम में फोल्ड करने के बजाय, प्रत्येक परिभाषित क्रम में अनुक्रमिक रूप से प्रत्येक तत्व को फोल्ड करने के बजाय फोल्ड करें। उन कार्यों के लिए जो कम्यूटिव नहीं हैं, परिणाम गैर-वितरित संग्रह पर लागू एक गुना से अलग हो सकता है "* –