डेटाफ्रेम repartition()
और डेटाफ्रेमवाइटर विभाजन() विधियों के बीच क्या अंतर है?स्पार्क एसक्यूएल - df.repartition और DataFrameWriter विभाजन के बीच अंतर?
मुझे आशा है कि दोनों partition data based on DF column
पर उपयोग किए जाएंगे? या कोई अंतर है?
डेटाफ्रेम repartition()
और डेटाफ्रेमवाइटर विभाजन() विधियों के बीच क्या अंतर है?स्पार्क एसक्यूएल - df.repartition और DataFrameWriter विभाजन के बीच अंतर?
मुझे आशा है कि दोनों partition data based on DF column
पर उपयोग किए जाएंगे? या कोई अंतर है?
यदि आप repartition(COL)
चलाते हैं तो आप गणना के दौरान विभाजन बदलते हैं - आपको spark.sql.shuffle.partitions
(डिफ़ॉल्ट: 200) विभाजन मिलेंगे। यदि आप .write
पर कॉल करते हैं तो आपको कई फाइलों के साथ एक निर्देशिका मिल जाएगी।
यदि आप .write.partitionBy(COL)
चलाते हैं तो परिणामस्वरूप आपको COL में अद्वितीय मानों के रूप में कई निर्देशिकाएं मिलेंगी। यह फ़्यूचर डेटा रीडिंग को गति देता है (यदि आप विभाजन कॉलम द्वारा फ़िल्टर करते हैं) और स्टोरेज पर कुछ स्थान बचाता है (विभाजन कॉलम डेटा फ़ाइलों से हटा दिया जाता है)।
देखें: मेरा मानना है कि स्वीकृत उत्तर बिल्कुल सही नहीं है! मुझे खुशी है कि आप इस सवाल से पूछते हैं, क्योंकि इन समान नामित कार्यों का व्यवहार महत्वपूर्ण और अप्रत्याशित तरीकों से भिन्न होता है जो आधिकारिक स्पार्क दस्तावेज़ीकरण में अच्छी तरह से प्रलेखित नहीं होते हैं।
स्वीकार्य उत्तर का पहला भाग सही है: df.repartition(COL, numPartitions=k)
कॉल करना k
विभाजन हैश-आधारित विभाजनकर्ता का उपयोग करके डेटाफ्रेम बनाएगा। COL
यहां विभाजन कुंजी को परिभाषित करता है - यह एक कॉलम या कॉलम की सूची हो सकता है। हैश-आधारित विभाजनकर्ता प्रत्येक इनपुट पंक्ति की विभाजन कुंजी लेता है, इसे k
विभाजनों की जगह में partition = hash(partitionKey) % k
जैसे कुछ हिस्सों में रखता है। यह गारंटी देता है कि एक ही विभाजन कुंजी के साथ सभी पंक्तियां एक ही विभाजन में समाप्त होती हैं। हालांकि, कई विभाजन कुंजी से पंक्तियां उसी विभाजन में समाप्त हो सकती हैं (जब विभाजन कुंजी के बीच हैश टकराव होता है) और कुछ विभाजन खाली हो सकते हैं।
सारांश में, df.repartition(COL, numPartitions=k)
की unintuitive पहलुओं कि
k
विभाजन के कुछ खाली हो सकता है, जबकि अन्य कई विभाजन कुंजीdf.write.partitionBy
का व्यवहार काफी अलग है, इस तरह से कई उपयोगकर्ता अपेक्षा नहीं करेंगे। आइए मान लें कि आप अपनी आउटपुट फाइलों को दिनांक-विभाजित करना चाहते हैं, और आपका डेटा 7 दिनों से अधिक समय तक फैला है। आइए यह भी मान लें कि df
के साथ शुरू करने के लिए 10 विभाजन हैं। जब आप df.write.partitionBy('day')
चलाते हैं, तो आपको कितनी आउटपुट फाइलों की अपेक्षा करनी चाहिए? उत्तर है, यह निर्भर करता है'। यदि df
में आपके शुरुआती विभाजन के प्रत्येक विभाजन में प्रत्येक दिन से डेटा होता है, तो उत्तर 70 है। यदि df
में आपके प्रत्येक प्रारंभिक विभाजन में एक दिन से डेटा होता है, तो उत्तर 10 है।
हम कैसे समझा सकते हैं यह व्यवहार? जब आप df.write
चलाते हैं, तो df
में प्रत्येक मूल विभाजन स्वतंत्र रूप से लिखा जाता है। यही है, आपके प्रत्येक मूल 10 विभाजन 'दिन' कॉलम पर अलग-अलग विभाजित होते हैं, और प्रत्येक उप-विभाजन के लिए एक अलग फ़ाइल लिखी जाती है।
मुझे यह व्यवहार बल्कि परेशान लगता है और इच्छा है कि डेटाफ्रेम लिखते समय वैश्विक पुनरावृत्ति करने का कोई तरीका हो।