(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Apache Spark
Apache Spark 4 min

Como remover duplicados no PySpark: passo a passo

João Barros 04 de July de 2026 4 min de leitura

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 pyspark instalada (pip install pyspark).
  • Uma SparkSession ativa (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.

Como remover duplicados no PySpark: passo a passo
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?

Partilhar: