La respuesta de Justin es asombrosa y esta respuesta se profundiza.
El repartitionalgoritmo 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 repartitionmétodo y obtengamos estos datos en dos nodos.
val numbersDfR = numbersDf.repartition(2)
Así es como numbersDfRse dividen los datos en mi máquina:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
El repartitionmé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 coalesceyrepartition
coalesce usa particiones existentes para minimizar la cantidad de datos que se barajan. repartitioncrea nuevas particiones y baraja completamente. coalesceda como resultado particiones con diferentes cantidades de datos (a veces particiones que tienen tamaños muy diferentes) y repartitionda como resultado particiones de aproximadamente el mismo tamaño.
¿Es coalesceo repartitionmás rápido?
coalescepuede 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 repartitionque 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 movementlugar deavoiding data movement.