Cómo implementar purga automática de datos en Lakehouse: paso a paso
Este tutorial muestra cómo implementar un mecanismo de purga automática de datos en Lakehouse para eliminar registros antiguos de forma segura y auditada. Es útil para cumplir políticas de retención, reducir costes de almacenamiento y mantener el rendimiento sin perder historial crítico.
Prerequisitos
- Cuenta con acceso al Lakehouse (ej.: OneLake/Delta tables) y permisos para leer/escribir y ejecutar jobs.
- Entorno PySpark o SQL sobre el Lakehouse (ej.: notebook en Fabric o clúster con PySpark).
- Conocimientos básicos de Delta Lake: tablas Delta, MERGE, VACUUM y Time Travel.
Paso 1: Definir política de retención y criterios de purga
Antes de cualquier código, decide qué eliminar: por ejemplo, registros con la fecha event_date anterior a N días, o filas con un estado específico. También define si vas a archivar antes de eliminar y quién aprueba la purga.
Paso 2: Crear tabla de control de purga (audit trail)
Registra cada ejecución de purga para auditoría: fecha, tabla objetivo, criterios, número de filas afectadas y usuario que ejecutó.
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;
Paso 3: Marcar filas para purga (soft-delete) usando columna de estado
Se recomienda hacer un paso intermedio para evitar pérdida accidental: marca las filas para purga usando una columna _expurgo_flag y guarda la versión antes de la eliminación.
# 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 filas
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")
Paso 4: Archivar las filas marcadas en una tabla histórica
Antes de borrar, copia las filas marcadas a una tabla de archivo (por ej., archive.vendas_expurgo) con metadatos de la ejecución.
-- 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;
Paso 5: Eliminar físicamente las filas con MERGE (hard-delete)
Usa MERGE para eliminar las filas marcadas de forma atómica y 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;
Paso 6: Actualizar tabla de control y ejecutar VACUUM
Registra el resultado en control.expurgo_audit y ejecuta VACUUM con cuidado para limpiar ficheros antiguos (asegura que Time Travel no vaya a ser necesario).
-- 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; -- retiene 7 días
Paso 7: Automatizar y manejar errores comunes
Crea un job programado (notebook/job) que ejecute los pasos, con logging y reversión parcial en caso de fallo. Errores comunes: olvidar archivar antes de eliminar, permisos insuficientes, no definir previamente la columna de marcación (ALTER TABLE) y usar VACUUM con retención demasiado baja.
Verificar el resultado
Confirma que:
- archive.vendas_expurgo contiene las filas archivadas con run_id y archived_at.
- bronze.vendas no contiene filas con _expurgo_flag = true.
- control.expurgo_audit tiene un registro con run_id y rows_deleted coherente.
- Time Travel permite verificar versiones anteriores si es necesario (SELECT * FROM bronze.vendas TIMESTAMP AS OF ...).
Conclusión
Implementar purga automática en Lakehouse protege el cumplimiento y reduce costes, combinando marcado, archivado, MERGE y VACUUM. Próximos pasos: incluir cifrado para los ficheros archivados, añadir notificaciones e integrar con las políticas de retención de la organización. Consejo: prueba siempre el proceso en un entorno de desarrollo con datos simulados antes de ejecutar en producción.