Como criar snapshots de tabelas Delta em Lakehouse: passo a passo
Este tutorial mostra como criar snapshots periódicos de uma tabela Delta no Lakehouse para fins de auditoria, cópia de segurança rápida e rollback fácil. Fazer snapshots ajuda a preservar estados históricos sem depender apenas do time travel ou VACUUM, e é útil para exportar versões para análises fora do Lakehouse.
Pré-requisitos
- Conta e workspace no Microsoft Fabric com Lakehouse disponível.
- Permissões de leitura/escrita no Lakehouse e no Direct Lake ou OneLake.
- Ambiente com PySpark (notebook no Fabric ou cluster que aceda ao Lakehouse).
- Conhecimentos básicos de Delta Lake, PySpark e SQL.
Passo 1: Escolher a tabela Delta e a estratégia de snapshot
Decide que tabela Delta queres snapshotar e com que frequência. Estratégias comuns: snapshot completo (cópia inteira) ou snapshot incremental com base em coluna de data/versão. Para começar, usaremos uma cópia completa diária para simplicidade.
Passo 2: Criar um diretório de snapshots no Lakehouse
Cria uma pasta dentro do Lakehouse ou OneLake onde serão guardados os snapshots como novas tabelas Delta com um prefixo date. Isto facilita a gestão e a limpeza.
# Exemplo PySpark para criar o diretório (se necessário apenas criar metadados)
from delta.tables import DeltaTable
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
# Paths de exemplo
lakehouse_base = 'abfss://@.dfs.core.windows.net/lakehouse'
snapshots_path = lakehouse_base + '/snapshots'
print(snapshots_path)
Passo 3: Exportar a tabela Delta para um snapshot com timestamp
Lê a tabela Delta original e grava-a como nova tabela Delta com sufixo de data/hora. Isto preserva o estado completo no momento do snapshot.
# Lê a tabela Delta existente e grava snapshot com timestamp
from datetime import datetime
table_path = lakehouse_base + '/tables/minha_tabela'
now = datetime.utcnow().strftime('%Y%m%d_%H%M%S')
snapshot_path = f"{snapshots_path}/minha_tabela_snapshot_{now}"
df = spark.read.format('delta').load(table_path)
# grava como nova tabela Delta
(df.write.format('delta')
.mode('overwrite')
.option('overwriteSchema','true')
.save(snapshot_path))
print(f'Snapshot criado em: {snapshot_path}')
Passo 4: Registar o snapshot como tabela no metastore (opcional)
Para facilitar consultas via endpoint de SQL analytics e catálogo, podes criar uma entrada no metastore que aponte para o snapshot.
# Exemplo SQL para criar tabela no metastore (no SQL notebook do Fabric)
CREATE TABLE IF NOT EXISTS snapshots.minha_tabela_snapshot_20240101_000000
USING DELTA
LOCATION 'abfss://@.dfs.core.windows.net/lakehouse/snapshots/minha_tabela_snapshot_20240101_000000';
Passo 5: Agendar snapshots automáticos
Usa um scheduler (Azure Data Factory, Power Automate, Azure Functions, ou job do Fabric) para executar o script PySpark diariamente. No Fabric podes usar pipelines para orquestrar um notebook que execute o código anterior.
# Exemplo esquemático: Azure Function (Python) invoca o notebook ou script PySpark
# Pseudocódigo para agendamento diário
# 1. Trigger Timer daily
# 2. Call Fabric notebook REST API or submit job to Spark cluster
# 3. Monitor retorno e regista sucesso/erro
Passo 6: Política de retenção e limpeza de snapshots
Define uma política para apagar snapshots antigos (por exemplo, manter 30 dias). Podes listar diretórios de snapshots e remover os que excedem a retenção. Atenção: apaga apenas os snapshots de que tens a certeza que não são necessários.
# Exemplo PySpark para listar e remover snapshots antigos (pseudo)
from datetime import datetime, timedelta
import re
retention_days = 30
cutoff = datetime.utcnow() - timedelta(days=retention_days)
# lista diretórios (exemplo com dbutils/fs ou filesystem API)
files = dbutils.fs.ls(snapshots_path)
for f in files:
m = re.search(r'minha_tabela_snapshot_(\d{8}_\d{6})', f.name)
if m:
ts = datetime.strptime(m.group(1), '%Y%m%d_%H%M%S')
if ts < cutoff:
dbutils.fs.rm(f.path, recurse=True)
print('Removido', f.path)
Verificar o resultado
Confirma que o snapshot existe lendo-o como Delta ou consultando a tabela registada no metastore. Verifica contagem de linhas, esquema e algumas linhas para garantir integridade.
# Verificação simples
snap = spark.read.format('delta').load(snapshot_path)
print('count=', snap.count())
snap.show(5)
Conclusão
Executaste um processo repetível para criar snapshots de tabelas Delta no Lakehouse, útil para auditoria, análise histórica e rollback. Próximos passos: automatizar com um job, testar a retenção e integrar notificações de sucesso/erro. Dica: começa por snapshots completos e, quando estiveres confortável, evolui para snapshots incrementais por partição para reduzir custos — queres um exemplo de snapshot incremental?