Como implementar expurgo automático de dados em Lakehouse: passo a passo
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.