Vấn đề là ở mã của bạn. Bởi vì bạn ghi đè lên một bảng mà từ đó bạn đang cố gắng đọc, bạn sẽ xóa tất cả dữ liệu một cách hiệu quả trước khi Spark thực sự có thể truy cập vào nó.
Hãy nhớ rằng Spark rất lười biếng. Khi bạn tạo Dataset Spark tìm nạp siêu dữ liệu bắt buộc nhưng không tải dữ liệu. Vì vậy, không có bộ nhớ cache ma thuật nào sẽ bảo toàn nội dung gốc. Dữ liệu sẽ được tải khi nó thực sự được yêu cầu. Đây là lúc bạn thực thi write hành động và khi bạn bắt đầu viết, không có thêm dữ liệu nào được tìm nạp.
Những gì bạn cần là một cái gì đó như thế này:
- Tạo
Dataset. -
Áp dụng các phép biến đổi cần thiết và ghi dữ liệu vào bảng MySQL trung gian.
-
TRUNCATEđầu vào ban đầu vàINSERT INTO ... SELECTtừ bảng trung gian hoặcDROPbảng gốc vàRENAMEbảng trung gian.
Cách tiếp cận thay thế, nhưng kém thuận lợi hơn, sẽ là:
- Tạo
Dataset. - Áp dụng các phép biến đổi bắt buộc và ghi dữ liệu vào bảng Spark liên tục (
df.write.saveAsTable(...)hoặc tương đương) -
TRUNCATEđầu vào ban đầu. - Đọc lại dữ liệu và lưu (
spark.table(...).write.jdbc(...)) - Thả bảng Spark.
Chúng tôi không thể nhấn mạnh rằng sử dụng Spark cache / persist không phải là con đường để đi. Ngay cả trong StorageLevel bảo thủ (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) dữ liệu đã lưu trong bộ nhớ đệm có thể bị mất (lỗi nút), dẫn đến lỗi sửa sai.