2015-05-29 12 views
6

पर विचार करेंआदेश एक RDD [स्ट्रिंग]

val animals = List("penguin","ferret","cat").toSeq 
val rdd = sc.makeRDD(animals, 1) 

मैं इस RDD ऑर्डर करने के लिए करना चाहते हैं। मैं स्कैला के लिए नया हूं और इस बारे में थोड़ा उलझन में हूं कि यह कैसे किया जाना है।

+0

मुझे स्पार्क के बारे में कोई जानकारी नहीं है लेकिन शायद यह आपका जवाब है: http://apache-spark-user-list.1001560.n3.nabble.com/How-to-sort-an-RDD-td1922.html – MeiSign

उत्तर

6

आरडीडी दस्तावेज here पाया जा सकता है। sortBy को देखो:

sortBy[K](
    f: (T) ⇒ K, 
    ascending: Boolean = true, 
    numPartitions: Int = this.partitions.size 
) 

K RDD आप द्वारा छँटाई कर रहे हैं के स्निपेट का प्रकार है। f एक फ़ंक्शन है, जिसे आप या तो def के साथ कहीं और परिभाषित कर सकते हैं और इसे नाम से पास कर सकते हैं या आप लाइन में एक अनामित रूप से बना सकते हैं (जो अधिक स्केल जैसा है)। ascending और numPartitions स्वयं स्पष्टीकरण होना चाहिए।

तो यह सब देखते हुए प्रयास करें:

rdd.sortBy[String]({animal => animal}) 

फिर इस कोशिश:

rdd.sortBy[String]({animal => animal}, false) 

और फिर यह एक है, जो के नाम पर पत्र "ई" की संख्या से RDD सॉर्ट करता पशु, सबसे से कम से कम करने के लिए:

rdd.sortBy[Int]({a => a.split("").filter(char => char == "e").size}, false) 

यह ध्यान देने योग्य है कि मूल rdd पृथक नहीं किया जा रहा है - एक नया, क्रमबद्ध आरडीडी ऑपरेशन द्वारा वापस किया जाता है।

+0

तो पहले मामले में हम जो कुछ भी देते हैं उसे वापस लौटाते हैं लेकिन हम वर्णमाला क्रम का पालन करते हैं, यह क्यों है? निहित आदेश [के] के साथ क्या करना है? – Chris

+0

यह डिफ़ॉल्ट ऑर्डरिंग [के] का पालन करता है, जहां के के रूप में के के समान है [के]। आप ऑर्डरिंग [के] को ओवरराइड कर सकते हैं, लेकिन मुझे इसकी आवश्यकता नहीं थी। –

+0

ऐसा लगता है कि आप इस मामले में अज्ञात फ़ंक्शन को पूरी तरह से छोड़ सकते हैं? यह मेरा हिस्सा है जो मुझे भ्रमित कर रहा है, लेकिन मैं समझता हूं कि आपने क्या रखा है और यह बहुत उपयोगी रहा है। – Chris

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