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 ... SELECT
từ bảng trung gian hoặcDROP
bảng gốc vàRENAME
bả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.