Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Spark SQL và MySQL- SaveMode.Overwrite không chèn dữ liệu đã sửa đổi

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ặc DROP 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. lỗi:'Không thể kết nối với máy chủ MySQL cục bộ thông qua socket' /var/run/mysqld/mysqld.sock '(2)' - Thiếu /var/run/mysqld/mysqld.sock

  2. Cập nhật tổng số dựa trên số dư hàng trước đó

  3. Chọn ngày trong tuần từ ngày

  4. Giải pháp thay thế cho cột được tạo trong MySQL 5.6 là gì

  5. Khóa chính đa cột MySQL