मैं स्पार्क और स्काला के लिए नया हूँ। मैं स्पार्क के विशिष्ट () फ़ंक्शन पर पढ़ रहा था। लेकिन मुझे कोई उचित विवरण नहीं मिला। मेरे कुछ संदेह हैं जिनका मैं समाधान नहीं कर सका और उन्हें लिख दिया है।

  1. स्पार्क में कितना अलग () लागू किया गया है?

    मैं पूरे प्रवाह की पहचान करने में सक्षम होने के लिए स्पार्क स्रोत कोड के साथ उतना अच्छा नहीं हूं। जब मैं निष्पादन योजना की जांच करता हूं, तो मैं केवल एक ShuffleRDD देख सकता हूं

  2. विशिष्ट की समय जटिलता क्या है?

    मैंने Google खोज से यह भी पाया कि यह किसी तरह हैशिंग और सॉर्टिंग का भी उपयोग करता है।

    इसलिए, मैंने सोचा कि क्या यह उसी सिद्धांत का उपयोग करता है जैसे हैशसेट की सहायता से सरणी से अद्वितीय तत्व प्राप्त करना। यदि यह एक प्रणाली होती, तो मैं अनुमान लगाता कि समय जटिलता O(nlogn) है।

    लेकिन इसे कई विभाजनों के बीच वितरित किया जाता है और फेरबदल किया जाता है, समय जटिलता का क्रम क्या होगा?

  3. क्या विशेष मामलों में फेरबदल से बचने का कोई तरीका है?

    अगर मैं अपने डेटा को अपने उपयोग-मामले के अनुसार ठीक से विभाजित करना सुनिश्चित करता हूं, क्या मैं फेरबदल से बच सकता हूँ?

    यानी उदाहरण के लिए, मान लें कि अद्वितीय पंक्तियों के साथ डेटाफ़्रेम में एक ArrayType कॉलम को विस्फोट करने से अन्य कॉलम डुप्लिकेट होने के साथ नई पंक्तियाँ बन जाती हैं। मैं अन्य स्तंभों का चयन करूंगा। इस तरह मैंने सुनिश्चित किया कि प्रति विभाजन डुप्लिकेट अद्वितीय हैं। चूंकि मुझे पता है कि प्रति विभाजन डुप्लिकेट अद्वितीय हैं, मैं फेरबदल से बच सकता हूं और उस विभाजन में केवल डुप्लीकेट छोड़ सकता हूं

मैंने यह भी पाया ) फ़ंक्शन प्रत्येक विभाजन से केवल अलग-अलग टुपल्स को फेरबदल करता है ।

आपकी सहायता के लिए धन्यवाद । अगर मैं कहीं गलत हूं तो कृपया मुझे सुधारें।

2
JohnAster 3 नवम्बर 2018, 10:46

1 उत्तर

सबसे बढ़िया उत्तर

स्पार्क में कितना अलग () लागू किया गया है?

None मान के साथ एक डमी एकत्रीकरण लागू करके। मोटे तौर पर

rdd.map((_, None)).reduceByKey((a, b) => a)

विशिष्ट की समय जटिलता क्या है?

प्रक्रिया की समग्र जटिलता को देखते हुए इसका अनुमान लगाना कठिन है। यह कम से कम ओ (एन लॉग एन) है, क्योंकि फेरबदल के लिए सॉर्ट की आवश्यकता होती है, लेकिन अतिरिक्त ऑफ कोर डेटा संरचनाओं (सहयोगी सरणियों सहित) के निर्माण के लिए आवश्यक कई अन्य ऑपरेशनों को देखते हुए, डेटा को क्रमबद्ध / deserialize अधिक हो सकता है, और व्यवहार में IO का प्रभुत्व है। संचालन, शुद्ध एल्गोरिथ्म जटिलता नहीं।

क्या विशेष मामलों में फेरबदल से बचने का कोई तरीका है?

हां, यदि संभावित डुप्लिकेट को उसी विभाजन पर रखे जाने की गारंटी है।

आप डेटा को समर्पित करने के लिए mapPartitions का उपयोग कर सकते हैं, खासकर यदि डेटा को सॉर्ट किया जाता है या किसी अलग पड़ोस में डुप्लिकेट होने की गारंटी दी जाती है। इसके बिना आप स्मृति आवश्यकताओं तक सीमित हो सकते हैं, जब तक कि आप संभाव्य फ़िल्टर (जैसे ब्लूम फ़िल्टर) के साथ अनुमानित परिणाम स्वीकार नहीं करते।

सामान्य तौर पर हालांकि यह संभव नहीं है, और इस तरह का ऑपरेशन गैर-स्थानीय होगा।

6
user10601984 3 नवम्बर 2018, 23:16