यह सवाल नया नहीं है, हालांकि मुझे स्पार्क में आश्चर्यजनक व्यवहार मिल रहा है। मुझे डेटाफ्रेम पर पंक्ति आईडी का एक स्तंभ जोड़ने की आवश्यकता है। मैंने डेटाफ्रेम विधि monotonically_increasing_id() का उपयोग किया और यह मुझे एक अतिरिक्त कॉल यूनिक्स पंक्ति आईडी प्रदान करता है (जो कि रास्ते से लगातार नहीं हैं, लेकिन अद्वितीय हैं)।मैं स्पार्क डेटाफ्रेम पर पंक्ति आईडी के लगातार कॉलम को कैसे जोड़ूं?
मेरी समस्या यह है कि जब मैं डेटाफ्रेम को फ़िल्टर करता हूं तो परिणामी डेटाफ्रेम में पंक्ति आईडी को फिर से असाइन किया जाता है। दो डेटाफ्रेम नीचे दिखाए गए हैं।
पहले एक पंक्ति आईडी जोड़ा साथ प्रारंभिक DataFrame इस प्रकार है:
df.withColumn("rowId", monotonically_increasing_id())
दूसरा DataFrame एक
df.filter(col("P"))
के माध्यम से col पी पर छानने के बाद प्राप्त होता है।
समस्या ग्राहकआईडी 169 है, जो प्रारंभिक DataFrame में 5 था के लिए rowId द्वारा सचित्र है, लेकिन छानने कि rowId (5) custmId 773 को फिर से सौंपा गया था जब ग्राहकआईडी 169 बाहर फ़िल्टर किया गया था के बाद! मुझे नहीं पता कि यह डिफ़ॉल्ट व्यवहार क्यों है।
मैं rowIds
"चिपचिपा" होना चाहता हूं; अगर मैं डेटाफ्रेम से पंक्तियां हटाता हूं, तो मैं नहीं चाहता कि उनकी आईडी "पुनः उपयोग" हो, मैं चाहता हूं कि वे अपनी पंक्तियों के साथ भी चले जाएं। क्या यह करना मुमकिन है? मुझे monotonically_increasing_id
विधि से इस व्यवहार का अनुरोध करने के लिए कोई झंडे नहीं दिख रहे हैं।
+---------+--------------------+-------+
| custId | features| P |rowId|
+---------+--------------------+-------+
|806 |[50,5074,...| true| 0|
|832 |[45,120,1...| true| 1|
|216 |[6691,272...| true| 2|
|926 |[120,1788...| true| 3|
|875 |[54,120,1...| true| 4|
|169 |[19406,21...| false| 5|
after filtering on P:
+---------+--------------------+-------+
| custId| features| P |rowId|
+---------+--------------------+-------+
| 806|[50,5074,...| true| 0|
| 832|[45,120,1...| true| 1|
| 216|[6691,272...| true| 2|
| 926|[120,1788...| true| 3|
| 875|[54,120,1...| true| 4|
| 773|[3136,317...| true| 5|
क्या आप दो उदाहरण डेटाफ्रेम बनाने के लिए अपना पूरा कोड साझा कर सकते हैं? इसके लायक होने के लिए, यह संभवतः SQL क्वेरी ऑप्टिमाइज़ेशन के कारण होता है, जिसमें "स्वतंत्र" मानचित्र चरणों को पुन: व्यवस्थित किया जा सकता है। –
हैमेल, मेरे द्वारा पोस्ट किए गए वास्तव में कोई अन्य परिवर्तन या कार्रवाई नहीं है। दिखाए गए डेटा फ्रेम df.show() का परिणाम हैं। आप इस व्यवहार को बहुत आसानी से पुनर्निर्मित कर सकते हैं, डेटा फ्रेम बना सकते हैं और ऊपर के रूप में एक पंक्ति आईडी कॉलम जोड़ सकते हैं, फिर इसमें एक यादृच्छिक बूलियन कॉलम जोड़ें। फिर उस कॉलम पर फ़िल्टर करें और देखें कि आपके द्वारा वर्णित रूप से बढ़ने वाली पंक्ति आईडी को "पुन: उपयोग" के रूप में वर्णित किया गया है। – Kai
@ काई मैं वास्तव में जोड़ दूंगा कि इसे पुन: उत्पन्न करने का सबसे आसान तरीका केवल एक ही विभाजन का उपयोग करना है। – zero323