La respuesta de Justin es asombrosa y esta respuesta se profundiza.
El repartition
algoritmo realiza una combinación completa y crea nuevas particiones con datos que se distribuyen de manera uniforme. Creemos un DataFrame con los números del 1 al 12.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf
Contiene 4 particiones en mi máquina.
numbersDf.rdd.partitions.size // => 4
Así es como se dividen los datos en las particiones:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
Hagamos una combinación completa con el repartition
método y obtengamos estos datos en dos nodos.
val numbersDfR = numbersDf.repartition(2)
Así es como numbersDfR
se dividen los datos en mi máquina:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
El repartition
método crea nuevas particiones y distribuye uniformemente los datos en las nuevas particiones (la distribución de datos es más uniforme para conjuntos de datos más grandes).
Diferencia entre coalesce
yrepartition
coalesce
usa particiones existentes para minimizar la cantidad de datos que se barajan. repartition
crea nuevas particiones y baraja completamente. coalesce
da como resultado particiones con diferentes cantidades de datos (a veces particiones que tienen tamaños muy diferentes) y repartition
da como resultado particiones de aproximadamente el mismo tamaño.
¿Es coalesce
o repartition
más rápido?
coalesce
puede ejecutarse más rápido que repartition
, pero las particiones de tamaño desigual son generalmente más lentas para trabajar que las particiones de igual tamaño. Por lo general, deberá volver a particionar los conjuntos de datos después de filtrar un conjunto de datos grande. En general, he descubierto repartition
que es más rápido porque Spark está diseñado para funcionar con particiones de igual tamaño.
Nota: curiosamente he observado que la repartición puede aumentar el tamaño de los datos en el disco . Asegúrese de ejecutar pruebas cuando esté utilizando repartición / fusión en grandes conjuntos de datos.
Lee esta publicación de blog si desea aún más detalles.
Cuando usarás fusión y reparto en la práctica
minimize data movement
lugar deavoiding data movement
.