Como validar partições de data em ELT: passo a passo
Este tutorial mostra como validar partições de data em ELT para garantir consistência, evitar lacunas e melhorar o desempenho de consultas. Validar partições de data é útil para detetar falhas de carga, ficheiros corrompidos e problemas de retenção antes que afectem relatórios ou pipelines downstream.
Pré-requisitos
- Acesso a um ambiente com suporte a ficheiros/Delta (por exemplo: Data Lake com Delta Lake ou parquet) e SQL/Notebooks.
- Ferramentas para correr SQL ou Python (por exemplo: Databricks, Synapse, ou outro ambiente com Spark/SQL).
- Conhecimentos básicos de ELT, partições por data (date, year/month/day) e comandos SQL/Python.
Passo 1: Identificar o esquema de partição
Perceber como os dados estão particionados: por date, year/month/day ou por outra convenção. Isto permite construir verificações específicas (lacunas, formatos inválidos, metadados).
# Exemplo SQL para ver estrutura de partição (Delta ou Hive metastore) DESCRIBE DETAIL nome_da_tabela; -- ou SHOW PARTITIONS nome_da_tabela LIMIT 100;
Passo 2: Listar partições esperadas
Gerar a lista de datas que deveriam existir no período de interesse. Isto ajuda a detetar lacunas (missing partitions) no intervalo de carga.
# Exemplo Python (Spark) para gerar datas esperadas entre start_date e end_date from pyspark.sql.functions import sequence, to_date, explode, lit start = '2026-09-01' end = '2026-09-10' dates_df = spark.sql(f"SELECT explode(sequence(to_date('{start}'), to_date('{end}'), interval 1 day)) as dt") dates_df.show()
Passo 3: Obter partições reais
Extrair as partições efectivamente presentes no armazenamento/metastore. Para Delta/Hive, podemos consultar as partições ou inferir a partir dos caminhos de ficheiro.
# Exemplo SQL para obter partições reais (tabela particionada por dt) SELECT DISTINCT dt FROM nome_da_tabela ORDER BY dt; -- Ou listar ficheiros no diretório de data: /data/tabela/dt=YYYY-MM-DD/
Passo 4: Comparar esperado vs real e reportar lacunas
Fazer a junção entre as datas esperadas e as reais para identificar dias em falta. Reporte resultados para alertas ou triggers de backfill.
# Exemplo Spark SQL juntando datas esperadas e reais dates_df.createOrReplaceTempView('expected_dates') spark.sql("""
SELECT e.dt as date_expected, r.dt as date_present
FROM expected_dates e
LEFT JOIN (SELECT DISTINCT dt FROM nome_da_tabela) r
ON e.dt = r.dt
WHERE r.dt IS NULL
ORDER BY e.dt
""").show()
Passo 5: Verificar integridade dos ficheiros por partição
Detetar ficheiros corrompidos ou com schema diferente que causem erros em leituras. Podemos tentar ler cada partição e capturar excepções; também validar número de ficheiros e tamanho mínimo.
# Exemplo Python para validar leitura por partição e contar ficheiros from pyspark.sql.utils import AnalysisException partitions = [r['dt'] for r in spark.sql("SELECT DISTINCT dt FROM nome_da_tabela").collect()] bad_partitions = [] for p in partitions: path = f"/data/nome_da_tabela/dt={p}" try: df = spark.read.format('delta').load(path) # ou parquet cnt = df.count() if cnt == 0: bad_partitions.append((p, 'empty')) except Exception as e: bad_partitions.append((p, str(e))) print('Partições com problemas:', bad_partitions)
Passo 6: Validar metadados e estatísticas por partição
Verificar colunas-chave (ex.: id, timestamp) para valores nulos, tipos inesperados ou outliers por partição. Calcular estatísticas básicas ajuda a detetar regressões.
# Exemplo SQL para checar nulos e contar por partição SELECT dt, COUNT(*) as rows, SUM(CASE WHEN id IS NULL THEN 1 ELSE 0 END) as id_nulls, MIN(event_time) as min_time, MAX(event_time) as max_time FROM nome_da_tabela GROUP BY dt ORDER BY dt;
Verificar o resultado
Confirme que:
- Não existem datas em falta na janela analisada (resultado do Passo 4 vazio).
- Lista de bad_partitions do Passo 5 está vazia ou tem apenas casos explicáveis.
- Estatísticas por partição (Passo 6) estão dentro de limites esperados (rows, id_nulls, min/max ok).
Conclusão
Validar partições de data em ELT previne falhas de carga e degradação de performance. Próximos passos: automatizar estas verificações como parte do pipeline (jobs agendados) e integrar alertas/rollback para partições com falhas. Dica: comece por monitorizar uma janela curta (7-14 dias) para reduzir falsos positivos e ajustar limites.