Tôi đang viết một quy trình ETL nơi tôi sẽ cần đọc các tệp nhật ký theo giờ, phân vùng dữ liệu và lưu nó. Tôi đang sử dụng Spark (trong Databricks). Tệp nhật ký là CSV nên tôi đọc chúng và áp dụng lược đồ, sau đó thực hiện các phép biến đổi của tôi.Nối dữ liệu mới vào các tệp gỗ được phân đoạn
Vấn đề của tôi là, làm thế nào tôi có thể lưu dữ liệu của mỗi giờ dưới dạng định dạng sàn nhưng thêm vào tập dữ liệu hiện có? Khi lưu, tôi cần phân vùng bằng 4 cột có trong khung dữ liệu.
Đây là dòng tiết kiệm của tôi:
data
.filter(validPartnerIds($"partnerID"))
.write
.partitionBy("partnerID","year","month","day")
.parquet(saveDestination)
Vấn đề là nếu thư mục đích tồn tại của tiết kiệm ném một lỗi. Nếu đích đến không tồn tại thì tôi sẽ không thêm các tệp của mình.
Tôi đã thử sử dụng .mode("append")
nhưng tôi thấy rằng đôi khi Spark không hoạt động giữa chừng vì vậy tôi sẽ mất bao nhiêu dữ liệu của mình được ghi và tôi vẫn cần viết bao nhiêu.
Tôi đang sử dụng sàn gỗ vì phân vùng tăng đáng kể truy vấn của tôi trong tương lai. Đồng thời, tôi phải ghi dữ liệu dưới dạng một số định dạng tệp trên đĩa và không thể sử dụng cơ sở dữ liệu như Druid hoặc Cassandra.
Bất kỳ đề xuất nào về cách phân vùng khung dữ liệu của tôi và lưu tệp (gắn bó với sàn gỗ hoặc định dạng khác) được đánh giá cao.
Bạn có thể chia sẻ những lỗi mà bạn nhận được khi bạn sử dụng '.mode (append)'. –
Lỗi tôi nhận được là: Gây ra bởi: java.io.IOException: Tệp đã tồn tại:/tracking/v4/010316/gif = a/partnerID = 111/year = 2016/month = 1/day = 3/part -r-00147-8f30e760-3706-4e4c-bf56-e3b5515942d1.gz.parquet Tôi nghĩ rằng lỗi này được ném do tính năng lập lịch biểu tác vụ không khớp khi một số thao tác ghi mất nhiều thời gian. – Saman