La risposta di Justin è fantastica e questa risposta è più approfondita.
L' repartition
algoritmo 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 repartition
metodo e otteniamo questi dati su due nodi.
val numbersDfR = numbersDf.repartition(2)
Ecco come numbersDfR
vengono partizionati i dati sulla mia macchina:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
Il repartition
metodo 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 coalesce
erepartition
coalesce
utilizza le partizioni esistenti per ridurre al minimo la quantità di dati che vengono mescolati. repartition
crea nuove partizioni e fa un riordino completo. coalesce
risulta in partizioni con diverse quantità di dati (a volte partizioni con dimensioni molto diverse) e repartition
genera partizioni di dimensioni approssimativamente uguali.
È coalesce
o repartition
più veloce?
coalesce
può 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 repartition
complessivamente 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 movement
invece diavoiding data movement
.