A resposta de Justin é incrível e essa resposta entra em mais profundidade.
O repartition
algoritmo 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 repartition
método e obter esses dados em dois nós.
val numbersDfR = numbersDf.repartition(2)
Aqui está como os numbersDfR
dados são particionados na minha máquina:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
O repartition
mé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 coalesce
erepartition
coalesce
usa partições existentes para minimizar a quantidade de dados que são embaralhados. repartition
cria novas partições e faz uma reprodução aleatória completa. coalesce
resulta em partições com diferentes quantidades de dados (às vezes partições com tamanhos muito diferentes) e repartition
resulta em partições de tamanho aproximadamente igual.
É coalesce
ou repartition
mais rápido?
coalesce
pode 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 repartition
ser 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 movement
vez deavoiding data movement
.