La réponse de Justin est impressionnante et cette réponse va plus en profondeur.
L' repartitionalgorithme 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 repartitionméthode et obtenons ces données sur deux nœuds.
val numbersDfR = numbersDf.repartition(2)
Voici comment les numbersDfRdonnées sont partitionnées sur ma machine:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
La repartitionmé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 coalesceetrepartition
coalesceutilise les partitions existantes pour minimiser la quantité de données mélangées. repartitioncrée de nouvelles partitions et fait un shuffle complet. coalesceentraîne des partitions avec différentes quantités de données (parfois des partitions de tailles très différentes) et repartitiondes partitions de taille à peu près égale.
Est coalesceou repartitionplus rapide?
coalescepeut 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é repartitionplus 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 movementau lieu deavoiding data movement.