Justin'in cevabı harika ve bu cevap daha derinlere iniyor.
repartition
Algoritma 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
repartition
Yöntemle tam bir karışıklık yapalım ve bu verileri iki düğümde alalım .
val numbersDfR = numbersDf.repartition(2)
numbersDfR
Veriler makinemde nasıl bölümlenir:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
repartition
Bu 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 coalesce
verepartition
coalesce
karıştırılan veri miktarını en aza indirmek için mevcut bölümleri kullanır. repartition
yeni bölümler oluşturur ve tam bir karıştırma yapar. coalesce
farklı miktarlarda veri içeren bölümlerle sonuçlanır (bazen çok farklı boyutlara sahip bölümler) ve repartition
kabaca eşit boyutlu bölümlerle sonuçlanır.
Daha hızlı mı coalesce
yoksa repartition
daha hızlı mı?
coalesce
daha 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. repartition
Genel 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 movement
yerine belgelerin daha iyi söylenmesi gerekirdiavoiding data movement
.