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.
-
TRUNCATE
masukan asli danINSERT INTO ... SELECT
dari tabel perantara atauDROP
tabel asli danRENAME
tabel 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) TRUNCATE
masukan 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.