A resposta de Justin é incrível e essa resposta entra em mais profundidade.
O repartitionalgoritmo faz uma shuffle completa e cria novas partições com dados distribuídos uniformemente. Vamos criar um DataFrame com os números de 1 a 12.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf contém 4 partições na minha máquina.
numbersDf.rdd.partitions.size // => 4
Aqui está como os dados são divididos nas partições:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
Vamos fazer um shuffle completo com o repartitionmétodo e obter esses dados em dois nós.
val numbersDfR = numbersDf.repartition(2)
Aqui está como os numbersDfRdados são particionados na minha máquina:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
O repartitionmétodo cria novas partições e distribui uniformemente os dados nas novas partições (a distribuição de dados é mais uniforme para conjuntos de dados maiores).
Diferença entre coalesceerepartition
coalesceusa partições existentes para minimizar a quantidade de dados que são embaralhados. repartitioncria novas partições e faz uma reprodução aleatória completa. coalesceresulta em partições com diferentes quantidades de dados (às vezes partições com tamanhos muito diferentes) e repartitionresulta em partições de tamanho aproximadamente igual.
É coalesceou repartitionmais rápido?
coalescepode executar mais rápido que repartition, mas partições de tamanhos desiguais geralmente são mais lentas para trabalhar com partições de tamanhos iguais. Você geralmente precisará reparticionar conjuntos de dados após filtrar um grande conjunto de dados. Descobri repartitionser mais rápido no geral, porque o Spark foi desenvolvido para funcionar com partições de tamanhos iguais.
NB: Curiosamente, observei que a repartição pode aumentar o tamanho dos dados no disco . Certifique-se de executar testes ao usar a repartição / coalescência em grandes conjuntos de dados.
Leia esta postagem no blog se desejar obter mais detalhes.
Quando você usar coalescência e reparticionamento na prática
minimize data movementvez deavoiding data movement.