स्पार्क के दस्तावेज़ में, यह कहता है कि आरडीडी विधि reduce
को एक सहयोगी और कम्यूटिव बाइनरी फ़ंक्शन की आवश्यकता होती है।स्पार्क: कम करने और कम करने के बीच अर्थशास्त्र का अंतर ByKey
हालांकि, विधि reduceByKey
केवल एक सहयोगी बाइनरी फ़ंक्शन की आवश्यकता है।
sc.textFile("file4kB", 4)
मैंने कुछ परीक्षण किए, और स्पष्ट रूप से यह मुझे प्राप्त व्यवहार है। यह अंतर क्यों है? reduceByKey
क्यों सुनिश्चित करता है कि reduce
पर कुछ आदेश (बाध्यकारीता की कमी के लिए समायोजित करने के लिए) बाइनरी फ़ंक्शन हमेशा लागू होता है?
उदाहरण के लिए, एक लोड कुछ (छोटे) 4 विभाजन (न्यूनतम) के साथ पाठ करता है, तो:
val r = sc.textFile("file4k", 4)
तो:
r.reduce(_ + _)
एक स्ट्रिंग जहां भागों उसी क्रम में हमेशा नहीं कर रहे हैं देता है, जबकि:
r.map(x => (1,x)).reduceByKey(_ + _).first
हमेशा एक ही स्ट्रिंग देता है (जहां सब कुछ उत्पत्ति की तुलना में एक ही क्रम में है एल फाइल)।
(मैंने r.glom
के साथ चेक किया और फ़ाइल सामग्री वास्तव में 4 विभाजनों में फैली हुई है, कोई खाली विभाजन नहीं है)।
मैं 'reduceByKey' साथ विचार लगता है कि आप शायद है कि है कई अलग-अलग कुंजियां इसलिए एक ही थ्रेड पर एक ही कुंजी के लिए सबकुछ कम करना ठीक है, जिसका अर्थ है कि आप हमेशा गणना को बाएं से दाएं चला सकते हैं। इसके विपरीत, 'कम करें' का उपयोग अक्सर बड़े डेटा सेट पर किया जाएगा, इसलिए संचालन के आदेश की परवाह नहीं करनी चाहिए। –
आप अपने प्रयोगों में कितने निष्पादक का उपयोग कर रहे हैं? – gprivitera