Como remover duplicados no PySpark: passo a passo
Remover duplicados no PySpark é uma das tarefas de limpeza de dados mais comuns: linhas repetidas inflacionam contagens, distorcem médias e criam erros nos relatórios. Neste guia vais aprender, passo a passo, a eliminar linhas duplicadas com os métodos dropDuplicates e distinct, seja em todas as colunas ou apenas nas que definem a tua chave.
Pré-requisitos
- Python 3 e a biblioteca
pysparkinstalada (pip install pyspark). - Uma
SparkSessionativa (mostramos como criar uma a seguir). - Conhecimentos básicos de Python e de DataFrames.
Passo 1: Criar uma SparkSession e dados de exemplo
Começa por iniciar o Spark e criar um DataFrame pequeno com linhas repetidas de propósito. Assim consegues ver o efeito de cada método antes de o aplicar aos teus dados reais.

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("remover-duplicados").getOrCreate()
dados = [
(1, "Ana", "Lisboa"),
(2, "Bruno", "Porto"),
(2, "Bruno", "Porto"),
(3, "Carla", "Braga"),
(3, "Carla", "Faro"),
]
colunas = ["id", "nome", "cidade"]
df = spark.createDataFrame(dados, colunas)
df.show()
Repara que a linha do Bruno aparece duas vezes exatamente igual, e que o id 3 (Carla) aparece com duas cidades diferentes. São dois tipos de "duplicado" distintos, e cada um pede um tratamento próprio.
Passo 2: Remover duplicados em todas as colunas
Para eliminar linhas totalmente iguais, chama dropDuplicates sem argumentos. Ele compara todas as colunas e mantém apenas uma cópia de cada linha repetida.
sem_duplicados = df.dropDuplicates()
sem_duplicados.show()
A linha duplicada do Bruno passa a aparecer uma só vez. O método df.distinct() faz exatamente o mesmo e é apenas uma forma alternativa de escrever isto. Como o Spark tem de comparar linhas entre partições, esta operação envolve um shuffle; em tabelas grandes vale a pena desduplicar o mais cedo possível no pipeline.
Passo 3: Remover duplicados por colunas específicas
Muitas vezes queres "um registo por cliente" ou "um por id", mesmo que as outras colunas variem. Passa a lista de colunas-chave ao dropDuplicates.
sem_duplicados_id = df.dropDuplicates(["id"])
sem_duplicados_id.show()
Agora fica só uma linha por id. Atenção a um detalhe importante: quando há valores diferentes nas outras colunas (o id 3 tinha "Braga" e "Faro"), o Spark não garante qual das linhas mantém. O resultado pode mudar entre execuções.
Erro comum: assumir que dropDuplicates(["id"]) devolve sempre a mesma linha. Não devolve — se precisas de um resultado estável, avança para o Passo 4.
Passo 4: Escolher qual duplicado manter
Quando a linha que fica importa (por exemplo, ficar com a cidade por ordem alfabética, ou com o registo mais recente), usa uma window function para ordenar dentro de cada chave e ficar com a primeira.
from pyspark.sql import Window
from pyspark.sql.functions import row_number, col
janela = Window.partitionBy("id").orderBy(col("cidade").asc())
df_numerado = df.withColumn("linha", row_number().over(janela))
resultado = df_numerado.filter(col("linha") == 1).drop("linha")
resultado.show()
Aqui, para cada id, ficamos com a cidade que vem primeiro por ordem alfabética. Basta mudar o orderBy (por exemplo para uma data com .desc()) para ficar antes com o registo mais recente.
Verificar o resultado
A forma mais simples de confirmar é comparar o número de linhas antes e depois. Se removeste duplicados, o segundo valor tem de ser menor.
print("Antes:", df.count())
print("Depois:", sem_duplicados.count())
No nosso exemplo, passamos de 5 para 4 linhas ao remover a repetição do Bruno. Confirma também visualmente com .show() que já não existem linhas iguais.
Conclusão
Já sabes remover duplicados no PySpark de três formas: em todas as colunas com dropDuplicates(), por uma chave com dropDuplicates(["id"]), e de forma controlada com uma window function. O próximo passo natural é tratar valores nulos (df.na.drop() ou df.na.fill()) e depois gravar os dados limpos em Parquet. Uma dica final: antes de desduplicar, confirma sempre quantas linhas repetidas tens e porquê — muitas vezes o duplicado esconde um problema no processo que o gerou. Que colunas definem uma linha "única" no teu conjunto de dados?