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

Cómo implementar purga automática de datos en Lakehouse: paso a paso

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

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.