La risposta di Justin è fantastica e questa risposta è più approfondita.
L' repartitionalgoritmo esegue un shuffle completo e crea nuove partizioni con dati distribuiti uniformemente. Creiamo un DataFrame con i numeri da 1 a 12.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf contiene 4 partizioni sulla mia macchina.
numbersDf.rdd.partitions.size // => 4
Ecco come vengono suddivisi i dati sulle partizioni:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
Facciamo un shuffle completo con il repartitionmetodo e otteniamo questi dati su due nodi.
val numbersDfR = numbersDf.repartition(2)
Ecco come numbersDfRvengono partizionati i dati sulla mia macchina:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
Il repartitionmetodo crea nuove partizioni e distribuisce uniformemente i dati nelle nuove partizioni (la distribuzione dei dati è più uniforme anche per set di dati più grandi).
Differenza tra coalesceerepartition
coalesceutilizza le partizioni esistenti per ridurre al minimo la quantità di dati che vengono mescolati. repartitioncrea nuove partizioni e fa un riordino completo. coalescerisulta in partizioni con diverse quantità di dati (a volte partizioni con dimensioni molto diverse) e repartitiongenera partizioni di dimensioni approssimativamente uguali.
È coalesceo repartitionpiù veloce?
coalescepuò essere eseguito più velocemente di repartition, ma le partizioni di dimensioni diverse sono generalmente più lente da lavorare rispetto alle partizioni di dimensioni uguali. In genere è necessario ripartizionare i set di dati dopo aver filtrato un set di dati di grandi dimensioni. Ho trovato repartitioncomplessivamente più veloce perché Spark è progettato per funzionare con partizioni di uguali dimensioni.
NB Ho curiosamente osservato che la ripartizione può aumentare la dimensione dei dati sul disco . Assicurati di eseguire i test quando utilizzi la ripartizione / coalescenza su set di dati di grandi dimensioni.
Leggi questo post sul blog se desideri ulteriori dettagli.
Quando in pratica utilizzerai la coalizione e la ripartizione
minimize data movementinvece diavoiding data movement.