Câu trả lời của Justin thật tuyệt vời và câu trả lời này đi sâu hơn.
Các repartitionthuật toán thực hiện một shuffle đầy đủ và tạo phân vùng mới với dữ liệu đó là phân bố đều. Hãy tạo một DataFrame với các số từ 1 đến 12.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf chứa 4 phân vùng trên máy của tôi.
numbersDf.rdd.partitions.size // => 4
Đây là cách dữ liệu được chia trên các phân vùng:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
Chúng ta hãy thực hiện một shuffle đầy đủ với repartitionphương thức và lấy dữ liệu này trên hai nút.
val numbersDfR = numbersDf.repartition(2)
Đây là cách numbersDfRdữ liệu được phân vùng trên máy của tôi:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
Các repartitionphương pháp làm cho phân vùng mới và đồng đều phân phối dữ liệu trong phân vùng mới (phân phối dữ liệu là hơn ngay cả đối với các tập dữ liệu lớn hơn).
Sự khác biệt giữa coalescevàrepartition
coalescesử dụng các phân vùng hiện có để giảm thiểu lượng dữ liệu được xáo trộn. repartitiontạo các phân vùng mới và thực hiện một shuffle đầy đủ. coalescedẫn đến các phân vùng có lượng dữ liệu khác nhau (đôi khi các phân vùng có kích thước khác nhau nhiều) và repartitiondẫn đến các phân vùng có kích thước gần bằng nhau.
Là coalescehay repartitionnhanh hơn?
coalescecó thể chạy nhanh hơn repartition, nhưng các phân vùng có kích thước không đồng đều thường hoạt động chậm hơn so với các phân vùng có kích thước bằng nhau. Thông thường bạn sẽ cần phân vùng lại bộ dữ liệu sau khi lọc một bộ dữ liệu lớn. tôi đã tìm thấyrepartition tổng thể nhanh hơn vì Spark được xây dựng để hoạt động với các phân vùng có kích thước bằng nhau.
NB Tôi đã tò mò quan sát rằng phân vùng lại có thể tăng kích thước dữ liệu trên đĩa . Đảm bảo chạy thử nghiệm khi bạn đang sử dụng phân vùng lại / kết hợp trên các bộ dữ liệu lớn.
Đọc bài đăng trên blog này nếu bạn muốn biết thêm chi tiết.
Khi bạn sử dụng kết hợp và phân chia lại trong thực tế
minimize data movementthay vìavoiding data movement.