Cả hai đều đổi số partition của DataFrame. repartition(n) luôn shuffle toàn bộ dữ liệu để chia lại cho đều, tăng hay giảm số partition đều được. coalesce(n) chỉ giảm số partition bằng cách gộp các partition sẵn có, không shuffle.
repartition(n) | coalesce(n) | |
|---|---|---|
| Shuffle | Có, toàn bộ dữ liệu | Không, gộp partition sẵn có |
| Tăng số partition | Được | Không |
| Kích thước partition sau đó | Đều nhau | Có thể lệch |
| Chia theo cột | repartition(n, "col") | Không |
python
# Sau filter chỉ còn 2% dữ liệu trên 2000 partition: gộp lại để không ghi 2000 file nhỏ
events.filter("country = 'VN'").coalesce(20).write.parquet(out)
# Ghi theo partition ngày: dòng cùng ngày về chung một partition, mỗi ngày ra một file
events.repartition("event_date").write.partitionBy("event_date").parquet(out)Trước khi ghi: dữ liệu đã giảm nhiều sau filter thì dùng coalesce cho rẻ. Cần file đều kích thước hoặc gom theo cột partition thì dùng repartition.
Lưu ý: coalesce(1) để ra một file duy nhất có thể kéo cả các bước tính phía trước chạy trên một task, vì không có shuffle ngăn cách. Nếu bắt buộc chỉ một file, repartition(1) thêm một bước shuffle nhưng các bước trước vẫn chạy song song, chỉ bước ghi chạy một task.