2015-03-03 12 views
11

मैं नक्शा समारोह के अंदर फ़िल्टर करने की कोशिश कर रहा हूं। मूल रूप से जिस तरह से मैं क्लासिक मानचित्र-कम में करूँगा वह है कि फ़िल्टर मानदंडों को पूरा करते समय मैपर संदर्भ में कुछ भी लिख नहीं पाएगा। मैं स्पार्क के साथ समान कैसे प्राप्त कर सकता हूं? मैं मानचित्र फ़ंक्शन से शून्य वापस नहीं कर सकता क्योंकि यह शफल चरण में विफल रहता है। मैं या तो फ़िल्टर फ़ंक्शन का उपयोग कर सकता हूं लेकिन यह डेटा सेट के अनावश्यक पुनरावृत्ति प्रतीत होता है जबकि मैं मानचित्र के दौरान एक ही कार्य कर सकता हूं। मैं डमी कुंजी के साथ आउटपुट आउटपुट करने का भी प्रयास कर सकता हूं लेकिन यह एक खराब कामकाज है।स्पार्क - मानचित्र के भीतर फ़िल्टर

rdd.flatMap:

+0

क्या आप इस मुद्दे को चित्रित करने वाले नमूना कोड जोड़ सकते हैं? – maasg

उत्तर

13

कुछ ही विकल्प हैं rdd.flatMap RDD में एक Traversable संग्रह समतल होगा। तत्वों को चुनने के लिए, आप आमतौर पर परिवर्तन के परिणामस्वरूप Option वापस कर देंगे।

rdd.flatMap(elem => if (filter(elem)) Some(f(elem)) else None) 

rdd.collect(pf: PartialFunction) आप एक आंशिक समारोह है कि फिल्टर करने और मूल RDD से तत्वों बदल सकता है प्रदान करने के लिए अनुमति देता है। आप इस विधि के साथ मेल खाने वाले पैटर्न की सभी शक्तियों का उपयोग कर सकते हैं।

rdd.collect{case t if (cond(t)) => f(t)} 
rdd.collect{case t:GivenType => f(t)} 

डीन Wampler टिप्पणी में उल्लेख के रूप में, rdd.map(f(_)).filter(cond(_)) रूप में अच्छा और भी तेजी से अन्य अधिक 'संक्षिप्त' जैसा कि ऊपर उल्लेख विकल्पों की तुलना में हो सकता है।

जहां f एक परिवर्तन (या मानचित्र) फ़ंक्शन है।

+3

यदि आप '... फ़िल्टर()। नक्शा()' का उपयोग करते हैं, तो उन्हें प्रत्येक विभाजन के लिए उसी कार्य में निष्पादित किया जाएगा, मैपरेडस में "मैपर" को चेन करने के समान। यह एक 'फ्लैटमैप' या 'संग्रह' से भी तेज हो सकता है, इस पर निर्भर करता है कि कितनी अस्थायी वस्तुओं को आवंटित किया जाता है, फिर जल्दी कचरा इकट्ठा किया जाता है। –

+0

@DanWampler मुझे पाइपलाइनिंग के बारे में पता था लेकिन यह जानना अच्छा है कि 'फ़िल्टर()। नक्शा() '' flatmap' या' collect 'से तेज़ हो सकता है ... हमने कई' मानचित्र() फ़िल्टर() 'को बदल दिया 'संग्रह()' बी/सी बेहतर पढ़ता है लेकिन पेर्फ की जांच करने की आवश्यकता होगी। धन्यवाद। – maasg

+0

धन्यवाद। अभी के लिए, "मानचित्र की श्रृंखला" रास्ता मुझे बाधित नहीं कर रहा है। जब मैं perf – nir

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