La réponse de Justin est impressionnante et cette réponse va plus en profondeur.
L' repartition
algorithme effectue un shuffle complet et crée de nouvelles partitions avec des données réparties uniformément. Créons un DataFrame avec les nombres de 1 à 12.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf
contient 4 partitions sur ma machine.
numbersDf.rdd.partitions.size // => 4
Voici comment les données sont réparties sur les partitions:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
Faisons un shuffle complet avec la repartition
méthode et obtenons ces données sur deux nœuds.
val numbersDfR = numbersDf.repartition(2)
Voici comment les numbersDfR
données sont partitionnées sur ma machine:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
La repartition
méthode crée de nouvelles partitions et distribue uniformément les données dans les nouvelles partitions (la distribution des données est plus uniforme pour les ensembles de données plus volumineux).
Différence entre coalesce
etrepartition
coalesce
utilise les partitions existantes pour minimiser la quantité de données mélangées. repartition
crée de nouvelles partitions et fait un shuffle complet. coalesce
entraîne des partitions avec différentes quantités de données (parfois des partitions de tailles très différentes) et repartition
des partitions de taille à peu près égale.
Est coalesce
ou repartition
plus rapide?
coalesce
peut s'exécuter plus rapidement que repartition
, mais les partitions de taille inégale sont généralement plus lentes à travailler que les partitions de taille égale. Vous devrez généralement répartir les ensembles de données après avoir filtré un grand ensemble de données. J'ai trouvé repartition
plus rapide dans l'ensemble parce que Spark est conçu pour fonctionner avec des partitions de taille égale.
NB J'ai curieusement observé que la répartition peut augmenter la taille des données sur le disque . Assurez-vous d'exécuter des tests lorsque vous utilisez la répartition / fusion sur de grands ensembles de données.
Lisez cet article de blog si vous souhaitez encore plus de détails.
Quand vous utiliserez coalesce & repartition dans la pratique
minimize data movement
au lieu deavoiding data movement
.