Masalahnya ada di kode Anda. Karena Anda menimpa tabel yang Anda coba baca, Anda secara efektif menghapus semua data sebelum Spark benar-benar dapat mengaksesnya.
Ingat bahwa Spark malas. Saat Anda membuat Dataset Spark mengambil metadata yang diperlukan, tetapi tidak memuat data. Jadi tidak ada cache ajaib yang akan mempertahankan konten asli. Data akan dimuat ketika benar-benar diperlukan. Ini dia saat Anda menjalankan write tindakan dan saat Anda mulai menulis, tidak ada lagi data yang harus diambil.
Yang Anda butuhkan adalah sesuatu seperti ini:
- Buat
Dataset. -
Terapkan transformasi yang diperlukan dan tulis data ke tabel MySQL perantara.
-
TRUNCATEmasukan asli danINSERT INTO ... SELECTdari tabel perantara atauDROPtabel asli danRENAMEtabel perantara.
Alternatif, tetapi pendekatan yang kurang menguntungkan, adalah:
- Buat
Dataset. - Terapkan transformasi yang diperlukan dan tulis data ke tabel Spark persisten (
df.write.saveAsTable(...)atau setara) TRUNCATEmasukan asli.- Baca kembali data dan simpan (
spark.table(...).write.jdbc(...)) - Lepaskan tabel Spark.
Kami tidak bisa cukup menekankan bahwa menggunakan Spark cache / persist bukanlah cara untuk pergi. Bahkan dengan StorageLevel yang konservatif (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) data yang di-cache dapat hilang (kegagalan node), yang menyebabkan kesalahan koreksi senyap.