PySpark: coalesce vs repartition
O coalesce
e o repartition
são dois métodos do PySpark (e, consequentemente
do Spark) para particionar os dados em memória. A diferença entre os métodos
está principalmente no shuffle de dados que ocorre.
No caso do coalesce
, não há shuffle, ou seja, os dados não são redistribuídos
entre as partições. Isso significa que ao final da aplicação do coalesce
as
partições poderão ser desiguais e poderão resultar em uma performance ruim
dependendo do que será feito desses dados.
Já no repartition
, os dados são redistribuídos igualmente de acordo com o
número de partições selecionadas. Devido à redistribuição dos dados, o
repartition
pode ser um pouco mais lento, mas há a certeza de que as partições
terão valores uniformes entre si.
Quando usar cada uma das operações?
Se você quiser apenas reduzir o número de partições de um dataset que não foi
filtrado ou que não teve seu número de linhas mudado de alguma forma, o
coalesce
é a melhor opção. Como não há a redistribuição dos dados, é uma
operação mais rápida. Contudo, a própria documentação do Spark não indica1
que o coalesce
seja usado quando você deseja reduzir o número de partições pra
apenas 1. Isso porque a operação vai concentrar tudo em um único nó e deixar a
execução muito lenta.
Se você aplicou uma série de filtros no seu dataset, altrando o número total de
linhas, e deixando suas partições com tamanhos desiguais2
repartition
é a opção melhor.
Referências
- https://kontext.tech/article/296/data-partitioning-in-spark-pyspark-in-depth-walkthrough
- https://stackoverflow.com/questions/31610971/spark-repartition-vs-coalesce