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

Como implementar retenção por tags em tabelas Delta no Lakehouse

João Barros 15 de September de 2026 4 min de leitura

Este tutorial mostra como implementar retenção por tags em tabelas Delta no Lakehouse: adicionar metadados de retenção, usar políticas que identifiquem ficheiros antigos e automatizar a remoção segura. Isto é útil para controlar custos, cumprir políticas de retenção e evitar perda de histórico importante.

Pré-requisitos

  • Conta com acesso ao Microsoft Fabric e permissões para criar Lakehouse/tabelas Delta.
  • Conhecimentos básicos de SQL e PySpark.
  • Uma tabela Delta existente no Lakehouse para testar (pode usar dados de amostra).

Passo 1: Decidir a política de retenção e as tags

Antes de alterar a tabela, defina as regras: por exemplo, tag "retention:30d" para dados purgáveis após 30 dias, ou "retention:365d" para dados regulatórios. As tags serão armazenadas como propriedades da tabela ou em colunas de ficheiro para automatizar a limpeza.

Passo 2: Adicionar uma coluna de tag (opção por linha) na tabela Delta

Se a retenção variar por linha (por exemplo, por tipo de registo), adicione uma coluna que indique a tag de retenção. Isto facilita consultas e filtros antes de um processo de purga.

-- Exemplo SQL para adicionar coluna de retenção (se necessário)
ALTER TABLE default.my_delta_table ADD COLUMNS (retention_tag STRING);

-- Atualizar linhas existentes com uma tag padrão
UPDATE default.my_delta_table SET retention_tag = 'retention:30d' WHERE retention_tag IS NULL;

Passo 3: Marcar versões ou ficheiros com propriedades (opção por ficheiro/tabela)

Para retenção ao nível de ficheiro ou tabela, use propriedades de tabela Delta (table properties) ou metadata quando escrever partições. Isto é útil para políticas aplicadas por job de manutenção.

-- Definir uma propriedade de tabela personalizada
ALTER TABLE default.my_delta_table SET TBLPROPERTIES (
  'retention.policy' = 'tagged'
);

Passo 4: Criar um job PySpark para identificar ficheiros elegíveis

O job lê o log da tabela Delta (metadados) ou a própria tabela e calcula a idade dos ficheiros/partições com base em timestamp. Filtra por retention_tag ou por propriedade para selecionar candidatos à remoção.

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, current_timestamp, datediff

spark = SparkSession.builder.getOrCreate()
# Ler a tabela Delta
df = spark.read.format('delta').table('default.my_delta_table')
# Exemplo: encontrar linhas com tag retention:30d e mais antigas que 30 dias pela coluna event_date
candidates = df.filter((col('retention_tag') == 'retention:30d') & (datediff(current_timestamp(), col('event_date')) > 30))
# Mostrar candidatos
candidates.select('id','event_date','retention_tag').show()

Passo 5: Fazer MERGE ou DELETE por lote com segurança

Depois de identificar os candidatos, execute um DELETE seguro com MERGE (upsert) ou operações Delta que preservem o histórico. Teste sempre com uma cópia ou usando time travel antes de purgar.

-- Exemplo SQL: apagar por condição
DELETE FROM default.my_delta_table WHERE retention_tag = 'retention:30d' AND event_date < date_sub(current_date(), 30);

-- Alternativa com MERGE (marcar como retired em vez de apagar)
MERGE INTO default.my_delta_table AS target
USING (SELECT id FROM default.my_delta_table WHERE retention_tag='retention:30d' AND event_date < date_sub(current_date(),30)) AS src
ON target.id = src.id
WHEN MATCHED THEN UPDATE SET target.is_retired = true;

Passo 6: Compactar e limpar ficheiros inativos (opcional)

Após o DELETE, ficheiros obsoletos permanecem no armazenamento até ao VACUUM. Use VACUUM com cuidado: defina um período >= período de time travel que necessita.

-- Exemplo: executar VACUUM com período seguro de 7 dias (padrão de produção costuma ser 7 dias ou mais)
VACUUM default.my_delta_table RETAIN 168 HOURS;

Verificar o resultado

Confirme que a retenção foi aplicada: 1) Execute queries para ver se os registos com retention_tag removidos não aparecem; 2) Verifique o log do Delta com DESCRIBE HISTORY; 3) Confirme que o espaço no Lakehouse diminuiu se correr VACUUM.

-- Verificar histórico e operações
DESCRIBE HISTORY default.my_delta_table;
-- Verificar contagem residual
SELECT COUNT(*) FROM default.my_delta_table WHERE retention_tag='retention:30d' AND event_date < date_sub(current_date(),30);

Conclusão

Implementar retenção por tags em tabelas Delta no Lakehouse permite automatizar a limpeza baseada em regras, equilibrando conformidade e custo. Próximos passos: integrar o job num pipeline agendado, versionar políticas e testar recovery com time travel. Dica: comece por marcar dados em ambiente de teste antes de aplicar em produção.