2015-01-07 11 views
6

मान लीजिए कि मेरे मनमानी वस्तुओं का आरडीडी है। मैं आरडीडी की 10 वीं (कहें) पंक्ति प्राप्त करना चाहता हूं। मुझे यह कैसे करना है? rdd.take (n) का उपयोग करने का एक तरीका है और फिर nth तत्व का उपयोग ऑब्जेक्ट है, लेकिन जब यह बड़ा होता है तो यह दृष्टिकोण धीमा होता है।स्पार्क आरडीडी की एनटी पंक्ति कैसे प्राप्त करें?

+0

मैं के जवाब का मानना ​​है की सुविधा देता है [इस सवाल] (http://stackoverflow.com/q/24677180/ 877069) यहां भी प्रासंगिक हैं। –

उत्तर

6

मैं कितना कुशल है, के रूप में यह स्पार्क के इंजन में वर्तमान और भविष्य के अनुकूलन पर निर्भर करता है पता नहीं है, लेकिन आप निम्न कार्य की कोशिश कर सकते हैं:

rdd.zipWithIndex.filter(_._2==9).map(_._1).first() 

पहले समारोह को बदल देती है RDD आईडीएक्स के साथ 0 से आगे की एक जोड़ी (मान, आईडीएक्स) में। दूसरा कार्य तत्व idx == 9 (10 वीं) के साथ लेता है। तीसरा कार्य मूल मूल्य लेता है। फिर परिणाम वापस आ गया है।

पहले फ़ंक्शन निष्पादन इंजन द्वारा खींचा जा सकता है और पूरे प्रसंस्करण के व्यवहार को प्रभावित कर सकता है। कोशिश करो।

किसी भी मामले में, अगर nबहुत बड़ी है, इस विधि में है कि यह ड्राइवर नोड में पहली n तत्वों की एक सरणी को इकट्ठा करने की आवश्यकता नहीं है कुशल है।

+2

दुर्भाग्यवश, 'zipWithIndex' को प्रत्येक विभाजन के इंडेक्स ऑफसेट की गणना करने के लिए डेटा पर पूर्ण पास की आवश्यकता होती है। यद्यपि यह अभी भी आपकी सबसे अच्छी शर्त है। – climbage

+0

मैंने कोशिश की और यह धीमा है। शायद एक पंक्ति प्राप्त करने के लिए ठीक है, लेकिन कई पंक्तियां प्राप्त करना, एक समय में एक बहुत धीमा है – Jake

2

मैंने विशाल डेटा के लिए यह जांच नहीं की है। लेकिन यह मेरे लिए ठीक काम करता है।

कहना n = 2, मैं 2 तत्व का उपयोग करना चाहते हैं,

data.take(2).drop(1) 
+0

आप इसे बड़े 'n' मानों के लिए नहीं करना चाहते हैं क्योंकि इसके परिणामस्वरूप पहले' n' तत्व (जो है विभाजन से प्रभावित ...) ड्राइवर कोड के लिए ... तो यह धीमा या असंभव हो सकता है ... – masu

+0

सहमत हैं। क्या ऐसा करने का कोई कुशल तरीका है? –

+0

AFAIK: उपरोक्त निकोल फेरारो के उत्तर में हमारे पास सबसे अच्छा दृष्टिकोण है। http://stackoverflow.com/a/27826498/2846609 – masu

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