2014-11-04 15 views
11

तो मैं पाइथन (Pyspark) का उपयोग कर स्पार्क सीखने की कोशिश कर रहा हूं। मैं जानना चाहता हूं कि फ़ंक्शन mapPartitions कार्य कैसे करें। यही वह इनपुट है जो इसे लेता है और यह आउटपुट क्या देता है। मुझे इंटरनेट से कोई उचित उदाहरण नहीं मिला। आइए कहें, मेरे पास एक आरडीडी ऑब्जेक्ट है जिसमें सूचियां हैं, जैसे कि नीचे।pyspark mapPartitions कैसे कार्य करता है?

[ [1, 2, 3], [3, 2, 4], [5, 2, 7] ] 

और मैं सभी सूचियों से तत्व 2 निकालना चाहते हैं, मैं कैसे प्राप्त होता है कि mapPartitions का उपयोग कर।

उत्तर

17

मानचित्र विभाजन विभाजन के तत्वों पर नहीं, विभाजन पर मानचित्र संचालन के रूप में सोचा जाना चाहिए। यह इनपुट वर्तमान विभाजन का सेट है, इसका आउटपुट विभाजन का एक और सेट होगा।

समारोह आप पारित नक्शा अपने RDD

समारोह के एक व्यक्ति तत्व आप पारित mapPartition अपने RDD प्रकार का एक iterable रखना चाहिए लेने के लिए और वापस जाने और कुछ अन्य या एक ही प्रकार के iterable चाहिए।

आपके मामले में आप शायद अभी

def filterOut2FromPartion(list_of_lists): 
    final_iterator = [] 
    for sub_list in list_of_lists: 
    final_iterator.append([x for x in sub_list if x != 2]) 
    return iter(final_iterator) 

filtered_lists = data.mapPartition(filterOut2FromPartion) 
+0

आप फ़िल्टरऑट 2 फ़ार्मापार्टिशन एफ में कुछ भी क्यों नहीं लौटते अभिषेक हुआ। दूसरा, पाइथन में कुछ अंतिम शब्द है? मुझे लगता है कि आप Final_iterator के बजाय final.iterator = [] कहना चाहते थे। – MetallicPriest

+0

समस्याओं को फिक्स्ड – bearrito

+0

मैंने इसे कार्यान्वित करने का प्रयास किया लेकिन मुझे त्रुटि मिली "सूची वस्तु एक पुनरावर्तक नहीं है"। साथ ही, मुझे लगता है कि जब आपने लिखा था कि x x x में x x = = 2], तो मुझे लगता है कि आप का मतलब है [एक्स के लिए x में x x = = 2]। मैंने वहां सूची का इस्तेमाल किया। – MetallicPriest

18

होगा यह yield का उपयोग कर एक जनरेटर समारोह के साथ mapPartitions उपयोग करना आसान हो

def filterOut2(line): 
    return [x for x in line if x != 2] 

filtered_lists = data.map(filterOut2) 

अगर आप mapPartition उपयोग करना चाहता था की तरह कुछ करना चाहता हूँ वाक्यविन्यास:

def filter_out_2(partition): 
    for element in partition: 
     if element != 2: 
      yield element 

filtered_lists = data.mapPartition(filter_out_2) 
+0

क्या यह सिर्फ एक सूची लौटने से तेज है? – cgreen

+1

@cgreen विभाजन में आपके सभी डेटा शामिल हैं। मुझे यकीन नहीं है कि आप अपने सभी डेटा को एक सूची में लोड करना चाहते हैं। जेनरेटर को सूचियों पर प्राथमिकता दी जाती है जब आप डेटा पर पुनरावृत्त कर रहे होते हैं। – Narek

+0

@ग्रीग्री जेनरेटर कम स्मृति का उपयोग करते हैं, क्योंकि शुरुआत में वस्तुओं की पूरी सूची उत्पन्न करने के बजाय, प्रत्येक आइटम को इसकी आवश्यकता होती है। तो यह निश्चित रूप से कम स्मृति का उपयोग करता है, और इसलिए शायद तेज़ है। [यहां पाइथन में जनरेटर का एक अच्छा स्पष्टीकरण है] (https://medium.freecodecamp.org/python-list-comprehensions-vs-generator-expressions-cef70ccb49db)। –