समस्या आपके कोड में है। क्योंकि आप उस तालिका को अधिलेखित कर देते हैं जिससे आप पढ़ने की कोशिश कर रहे हैं, इससे पहले कि स्पार्क वास्तव में इसे एक्सेस कर सके, आप सभी डेटा को प्रभावी ढंग से मिटा दें।
याद रखें कि स्पार्क आलसी है। जब आप एक Dataset
बनाते हैं स्पार्क आवश्यक मेटाडेटा प्राप्त करता है, लेकिन डेटा लोड नहीं करता है। तो कोई जादू कैश नहीं है जो मूल सामग्री को सुरक्षित रखेगा। डेटा तब लोड किया जाएगा जब वास्तव में इसकी आवश्यकता होगी। यह तब होता है जब आप write
. निष्पादित करते हैं क्रिया और जब आप लिखना शुरू करते हैं तो प्राप्त करने के लिए कोई और डेटा नहीं होता है।
आपको जो चाहिए वह कुछ इस प्रकार है:
- एक
Dataset
। -
आवश्यक परिवर्तन लागू करें और एक मध्यवर्ती MySQL तालिका में डेटा लिखें।
-
TRUNCATE
मूल इनपुट औरINSERT INTO ... SELECT
मध्यवर्ती तालिका याDROP
. से मूल तालिका औरRENAME
मध्यवर्ती तालिका।
वैकल्पिक, लेकिन कम अनुकूल तरीका होगा:
- एक
Dataset
। - आवश्यक परिवर्तन लागू करें और एक सतत स्पार्क तालिका में डेटा लिखें (
df.write.saveAsTable(...)
या समकक्ष) TRUNCATE
मूल इनपुट।- डेटा वापस पढ़ें और सहेजें (
spark.table(...).write.jdbc(...)
) - स्पार्क टेबल छोड़ें।
हम इस बात पर जोर नहीं दे सकते कि स्पार्क cache
का उपयोग कर रहे हैं / persist
जाने का रास्ता नहीं है। रूढ़िवादी StorageLevel
. के साथ भी (MEMORY_AND_DISK_2
/ MEMORY_AND_DISK_SER_2
) कैश्ड डेटा खो सकता है (नोड विफलताएं), जिससे मूक शुद्धता त्रुटियां हो सकती हैं।