Justin'in cevabı harika ve bu cevap daha derinlere iniyor.
repartitionAlgoritma tam karıştır yapar ve eşit dağıtılan verilerle yeni bölümler yaratır. 1'den 12'ye kadar rakamlarla bir DataFrame oluşturalım.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf makinemde 4 bölüm var.
numbersDf.rdd.partitions.size // => 4
Veriler bölümlere nasıl ayrılır:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
repartitionYöntemle tam bir karışıklık yapalım ve bu verileri iki düğümde alalım .
val numbersDfR = numbersDf.repartition(2)
numbersDfRVeriler makinemde nasıl bölümlenir:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
repartitionBu yöntem yeni bölümleri yapar ve düzgün bir şekilde (veri dağılımı daha da büyük veri setleri için) yeni bölümleri veri dağıtır.
Fark arasında coalesceverepartition
coalescekarıştırılan veri miktarını en aza indirmek için mevcut bölümleri kullanır. repartitionyeni bölümler oluşturur ve tam bir karıştırma yapar. coalescefarklı miktarlarda veri içeren bölümlerle sonuçlanır (bazen çok farklı boyutlara sahip bölümler) ve repartitionkabaca eşit boyutlu bölümlerle sonuçlanır.
Daha hızlı mı coalesceyoksa repartitiondaha hızlı mı?
coalescedaha hızlı çalışabilir repartition, ancak eşit olmayan boyutlu bölümlerin çalışması genellikle eşit boyutlu bölümlere göre daha yavaştır. Büyük bir veri kümesini filtreledikten sonra genellikle veri kümelerini yeniden bölümlendirmeniz gerekir. repartitionGenel olarak daha hızlı buldum çünkü Spark eşit boyutlu bölümlerle çalışacak şekilde üretildi.
Not: Yeniden bölümlemenin diskteki veri boyutunu artırabileceğini merakla gözlemledim . Büyük veri kümelerinde yeniden bölüm / birleşim kullanırken testler yaptığınızdan emin olun.
Daha fazla ayrıntı istiyorsanız bu blog gönderisini okuyun .
Uygulamada birleştirme ve yeniden bölümlemeyi kullanacağınız zaman
minimize data movementyerine belgelerin daha iyi söylenmesi gerekirdiavoiding data movement.