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 repartition
thuậ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 repartition
phươ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 numbersDfR
dữ 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 repartition
phươ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 coalesce
vàrepartition
coalesce
sử 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. repartition
tạo các phân vùng mới và thực hiện một shuffle đầy đủ. coalesce
dẫ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à repartition
dẫn đến các phân vùng có kích thước gần bằng nhau.
Là coalesce
hay repartition
nhanh hơn?
coalesce
có 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 movement
thay vìavoiding data movement
.