जस्टिन का जवाब बहुत बढ़िया है और यह प्रतिक्रिया अधिक गहराई में जाती है।
repartitionएल्गोरिथ्म एक पूर्ण फेरबदल करता है और डेटा है कि समान रूप से वितरित है के साथ नए विभाजन पैदा करता है। 1 से 12 तक की संख्या के साथ एक DataFrame बनाते हैं।
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf मेरी मशीन पर 4 विभाजन हैं।
numbersDf.rdd.partitions.size // => 4
यहां बताया गया है कि डेटा को विभाजन पर कैसे विभाजित किया जाता है:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
आइए repartitionविधि के साथ एक पूर्ण-फेरबदल करें और दो नोड्स पर यह डेटा प्राप्त करें।
val numbersDfR = numbersDf.repartition(2)
यहां बताया गया है कि numbersDfRमेरी मशीन पर डेटा कैसे विभाजित किया जाता है:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
repartitionविधि नया विभाजन बनाता है और समान रूप से नया विभाजन में डेटा वितरित करता है (डेटा वितरण और भी बड़े डेटा सेट के लिए है)।
coalesceऔर के बीच अंतरrepartition
coalesceमौजूदा विभाजन का उपयोग करता है, जो कि फेरबदल किए गए डेटा की मात्रा को कम करता है। repartitionनए विभाजन बनाता है और एक पूर्ण फेरबदल करता है। coalesceअलग-अलग मात्रा में डेटा के साथ विभाजन में परिणाम (कभी-कभी ऐसे विभाजन जिनमें बहुत अधिक आकार होते हैं) और repartitionपरिणाम लगभग बराबर आकार के विभाजन के होते हैं।
है coalesceया repartitionतेजी से?
coalesceकी तुलना में तेजी से चल सकता है repartition, लेकिन असमान आकार के विभाजन समान आकार के विभाजन की तुलना में काम करने के लिए आमतौर पर धीमे होते हैं। एक बड़े डेटा सेट को फ़िल्टर करने के बाद आपको आमतौर पर डेटासेट को पुन: प्रारंभ करना होगा। मैंने repartitionसमग्र रूप से तेजी से पाया है क्योंकि स्पार्क समान आकार के विभाजन के साथ काम करने के लिए बनाया गया है।
एनबी मैंने उत्सुकता से देखा है कि पुनरावृत्ति डिस्क पर डेटा का आकार बढ़ा सकती है । जब आप बड़े डेटासेट पर रिपार्ट / कॉलेसे का उपयोग कर रहे हों, तो परीक्षण चलाना सुनिश्चित करें।
यदि आप और भी अधिक विवरण चाहते हैं तो इस ब्लॉग पोस्ट को पढ़ें ।
जब आप अभ्यास में सहवास और पुनरावृत्ति का उपयोग करेंगे
- किसी एकल फ़ाइल में DataFrame लिखने के लिए coalesce & repartition का उपयोग करने के तरीके पर यह प्रश्न देखें
- फ़िल्टरिंग क्वेरी को चलाने के बाद पुनरावृत्ति के लिए यह महत्वपूर्ण है । फ़िल्टर करने के बाद विभाजन की संख्या नहीं बदलती है, इसलिए यदि आप पुनरावृत्ति नहीं करते हैं, तो आपके पास बहुत अधिक मेमोरी विभाजन होंगे (फ़िल्टर जितना डेटासेट आकार को कम करता है, उतना ही बड़ा समस्या)। से सावधान रहें खाली विभाजन समस्या ।
- विभाजन का उपयोग डिस्क पर विभाजन में डेटा लिखने के लिए किया जाता है। आपको विभाजन का उपयोग करने से पहले अपने डेटा को ठीक से मेमोरी में विभाजित करने के लिए रिपर्टिशन / कोलेसस का उपयोग करना होगा।
minimize data movementबजाय बेहतर कहा जाना चाहिए थाavoiding data movement।