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

Como implementar expurgo automático de dados em Lakehouse: passo a passo

João Barros 10 de November de 2026 4 min de leitura

Este tutorial mostra como implementar um mecanismo de expurgo automático de dados em Lakehouse para remover registos antigos de forma segura e auditável. É útil para cumprir políticas de retenção, reduzir custos de armazenamento e manter o desempenho sem perder histórico crítico.

Pré-requisitos

  • Conta com acesso ao Lakehouse (ex.: OneLake/Delta tables) e permissões para ler/escrever e executar jobs.
  • Ambiente PySpark ou SQL sobre o Lakehouse (ex.: notebook no Fabric ou cluster com PySpark).
  • Conhecimentos básicos de Delta Lake: tabelas Delta, MERGE, VACUUM e Time Travel.

Passo 1: Definir política de retenção e critérios de expurgo

Antes de qualquer código, decide o que remover: por exemplo, registos com a data event_date anterior a N dias, ou linhas com um estado específico. Também define se vais arquivar antes de excluir e quem aprova o expurgo.

Passo 2: Criar tabela de controlo de expurgo (audit trail)

Regista cada execução de expurgo para auditoria: data, tabela alvo, critérios, número de linhas afetadas e utilizador que executou.

CREATE TABLE IF NOT EXISTS control.expurgo_audit (
  run_id STRING,
  target_table STRING,
  criteria STRING,
  exec_time TIMESTAMP,
  rows_marked BIGINT,
  rows_deleted BIGINT,
  status STRING
) USING DELTA;

Passo 3: Marcar linhas para expurgo (soft-delete) usando coluna de estado

É recomendável fazer um passo intermédio para evitar perda acidental: marca as linhas para expurgo usando uma coluna _expurgo_flag e grava a versão antes da remoção.

# Exemplo PySpark
from pyspark.sql import functions as F
from uuid import uuid4

target = "bronze.vendas"
cutoff_days = 365
run_id = str(uuid4())
cutoff = F.date_sub(F.current_date(), cutoff_days)

# Marca linhas
spark.sql(f"ALTER TABLE {target} ADD COLUMNS (_expurgo_flag BOOLEAN) ")

spark.sql(f"MERGE INTO {target} t USING (
  SELECT *, true as _expurgo_flag FROM {target} WHERE event_date < date_sub(current_date(), {cutoff_days})
) s ON t.id = s.id WHEN MATCHED THEN UPDATE SET t._expurgo_flag = s._expurgo_flag")

Passo 4: Arquivar as linhas marcadas para uma tabela histórica

Antes de apagar, copia as linhas marcadas para uma tabela de arquivo (por ex., archive.vendas_expurgo) com metadata da execução.

-- Exemplo SQL
INSERT INTO archive.vendas_expurgo
SELECT *, '$run_id' as run_id, current_timestamp() as archived_at
FROM bronze.vendas
WHERE _expurgo_flag = true;

Passo 5: Remover fisicamente as linhas com MERGE (hard-delete)

Usa MERGE para eliminar as linhas marcadas de forma atomicamente consistente.

MERGE INTO bronze.vendas t
USING (SELECT id FROM bronze.vendas WHERE _expurgo_flag = true) s
ON t.id = s.id
WHEN MATCHED THEN DELETE;

Passo 6: Atualizar tabela de controlo e executar VACUUM

Regista o resultado no control.expurgo_audit e executa VACUUM com cuidado para limpar ficheiros antigos (garante que Time Travel não seja necessário).

-- Registar execução (exemplo SQL simplificado)
INSERT INTO control.expurgo_audit VALUES (
  '$run_id', 'bronze.vendas', 'event_date < date_sub(current_date(), 365)', current_timestamp(), NULL, /*rows_deleted*/(SELECT count(*) FROM bronze.vendas WHERE _expurgo_flag = true), 'completed'
);

-- Executar VACUUM apenas depois de confirmar que Time Travel não é necessário
VACUUM bronze.vendas RETAIN 168 HOURS;  -- retém 7 dias

Passo 7: Automatizar e tratar erros comuns

Cria um job agendado (notebook/job) que execute os passos, com logging e reversão parcial em caso de falha. Erros comuns: esquecer de arquivar antes de eliminar, permissões insuficientes, não definir previamente a coluna de marcação (ALTER TABLE) e usar VACUUM com retenção demasiado baixa.

Verificar o resultado

Confirma que:

  • archive.vendas_expurgo contém as linhas arquivadas com run_id e archived_at.
  • bronze.vendas não contém linhas com _expurgo_flag = true.
  • control.expurgo_audit tem um registo com run_id e rows_deleted coerente.
  • Time Travel permite verificar versões anteriores se necessário (SELECT * FROM bronze.vendas TIMESTAMP AS OF ...).

Conclusão

Implementar expurgo automático em Lakehouse protege a conformidade e reduz custos, combinando marcação, arquivamento, MERGE e VACUUM. Próximos passos: incluir encriptação para os ficheiros arquivados, acrescentar notificações e integrar com as políticas de retenção da organização. Dica: testa sempre o processo num ambiente de desenvolvimento com dados simulados antes de executar em produção.