lección 6
Time travel y versionado: volver al pasado de tus datos
Snapshots, rollback, auditoría temporal, branching y cherry-pick. El killer feature de los table formats modernos.
⏱ 50 min
Imagina que es lunes por la mañana. El CEO te llama furioso: "el dashboard de ventas muestra números absurdos desde el viernes". Tu pipeline del sábado hizo algo mal — corrompió datos, duplicó registros, o aplicó una transformación incorrecta. Sin time travel, tu único recurso es buscar backups, rezar para que sean recientes, y restaurar manualmente. Con time travel, simplemente dices: "muéstrame los datos como estaban el viernes a las 18:00" y haces rollback. Problema resuelto en 30 segundos.
Seguimos en modo panorama: aquí entiendes QUÉ es el time travel y para qué te salva la vida, con SQL de ejemplo que ilustra la idea. Ejecutar rollbacks y consultas AS OF sobre una tabla real requiere un motor compatible (Spark, Trino, Athena) que no cabe en el navegador. Por eso los ejercicios de esta lección son de diseño/análisis: lo importante hoy es que interiorices el concepto, no que lo pongas en marcha.
### Qué es time travel en el contexto de data lakes
Time travel es la capacidad de consultar los datos de una tabla tal y como estaban en un momento anterior. No es magia — funciona porque los table formats como Iceberg y Delta Lake mantienen un historial de snapshots inmutables. Cada vez que haces un commit (INSERT, UPDATE, DELETE), se crea un nuevo snapshot. Los snapshots anteriores NO se borran — se mantienen accesibles para consultas históricas.
La analogía perfecta es Git para código. Cada commit en Git crea un snapshot del código. Puedes hacer checkout de cualquier commit anterior para ver el código como estaba en ese momento. Time travel es exactamente lo mismo pero para datos. Y así como Git no duplica archivos sin cambios (usa punteros), Iceberg tampoco duplica data files — solo crea nuevos manifests que apuntan a los archivos existentes más los nuevos.
### Consultas temporales: snapshot-id y timestamp
1-- Time travel por timestamp: ¿cómo estaba la tabla el viernes?2SELECT * FROM lake.ventas3FOR SYSTEM_TIME AS OF TIMESTAMP '2024-01-19 18:00:00';45-- Time travel por snapshot ID: volver a un snapshot específico6SELECT * FROM lake.ventas7FOR SYSTEM_VERSION AS OF 1001;89-- Ver el historial completo de snapshots10SELECT snapshot_id, committed_at, operation, summary11FROM lake.ventas.snapshots12ORDER BY committed_at DESC;1314-- Comparar dos snapshots: ¿qué cambió?15SELECT * FROM lake.ventas FOR SYSTEM_VERSION AS OF 100216EXCEPT17SELECT * FROM lake.ventas FOR SYSTEM_VERSION AS OF 1001;
Consultas de time travel en Iceberg: por timestamp y por snapshot ID
### Rollback: deshacer el desastre
Rollback es la operación más valiosa en producción. Cuando un pipeline corrupto escribe datos malos, puedes "rebobinar" la tabla a un estado anterior conocido como bueno. No reescribe datos — simplemente actualiza el puntero del catalog para que apunte a un snapshot anterior. Es instantáneo sin importar el tamaño de la tabla.
1-- Rollback a un snapshot específico (instantáneo)2CALL lake.system.rollback_to_snapshot('lake.ventas', 1001);34-- Rollback a un timestamp5CALL lake.system.rollback_to_timestamp('lake.ventas', TIMESTAMP '2024-01-19 18:00:00');67-- Verificar que el rollback funcionó8SELECT snapshot_id, committed_at, operation9FROM lake.ventas.snapshots10ORDER BY committed_at DESC11LIMIT 5;
Rollback instantáneo: cambia el puntero del catalog sin tocar datos
El rollback en Iceberg es un nuevo commit que apunta a los mismos archivos que un snapshot anterior. No borra el snapshot "malo" del historial — sigue ahí para auditoría. Es como hacer git revert en vez de git reset --hard.
### Auditoría temporal: quién hizo qué y cuándo
Time travel no solo sirve para rollback. Es una herramienta de auditoría increíblemente poderosa. Cada snapshot registra: quién lo creó, cuándo, qué operación fue (append, overwrite, delete), cuántos archivos se añadieron/eliminaron, y cuántas filas cambiaron. Esto te da un log completo de la vida de la tabla.
- Regulación: "demuestra que los datos del informe financiero de Q4 no se han modificado desde que se generó" — consulta el snapshot exacto de esa fecha.
- Debugging: "los números del lunes eran correctos pero los del martes no" — compara los snapshots del lunes y martes para ver exactamente qué cambió.
- Reproducibilidad: "entrena el modelo ML con los datos exactos del 15 de enero" — time travel al snapshot de esa fecha, garantizando reproducibilidad.
- Reconciliación: "el pipeline del viernes falló y se reejecutó el sábado — ¿perdimos datos?" — compara snapshots pre y post fallo.
### Retención de snapshots y expire
Los snapshots en sí son metadata y pesan poco (unos pocos KB cada uno). Lo que cuesta de verdad retenerlos no es ese metadata — es que cada snapshot mantiene vivos los ficheros de datos que referencia. Cuando solo haces appends, los snapshots comparten los mismos data files y el coste extra es mínimo. Pero cuando reescribes datos (un UPDATE en copy-on-write, por ejemplo), cada commit genera una copia nueva del fichero modificado, y el snapshot antiguo mantiene viva la copia anterior. Diez reescrituras con diez snapshots retenidos son diez copias vivas del mismo dato en disco. Por eso expire_snapshots es la operación que de verdad libera espacio: no borra metadata, borra los ficheros de datos que ya ningún snapshot necesita.
1-- Expirar snapshots más antiguos de 7 días2CALL lake.system.expire_snapshots(3 table => 'lake.ventas',4 older_than => TIMESTAMP '2024-01-20 00:00:00',5 retain_last => 10 -- mantener siempre al menos 10 snapshots6);78-- Ver qué archivos se pueden limpiar (orphan files)9CALL lake.system.remove_orphan_files(10 table => 'lake.ventas',11 older_than => TIMESTAMP '2024-01-15 00:00:00'12);
Gestión de retención: expirar snapshots antiguos y limpiar archivos huérfanos
Una vez que expiras un snapshot, pierdes la capacidad de hacer time travel a ese punto. Define una política de retención ANTES de activar la expiración automática. Recomendación mínima: 7 días para tablas operacionales, 30-90 días para tablas reguladas.
### Branching y tagging: Git para datos
Iceberg v2 introdujo branching y tagging — funcionalidades directamente inspiradas en Git. Un branch es una referencia con nombre a un snapshot que puede avanzar independientemente. Un tag es una referencia inmutable a un snapshot concreto.
1-- Crear un tag para marcar un snapshot importante2ALTER TABLE lake.ventas3 CREATE TAG reporte_q4_20244 AS OF VERSION 10505 RETAIN 365 DAYS;67-- Crear un branch para experimentación8ALTER TABLE lake.ventas9 CREATE BRANCH experimental10 AS OF VERSION 1050;1112-- Escribir al branch sin afectar main13INSERT INTO lake.ventas.branch_experimental14SELECT * FROM staging.ventas_nuevas;1516-- Consultar el branch17SELECT count(*) FROM lake.ventas VERSION AS OF 'experimental';1819-- Si todo OK, hacer fast-forward merge (conceptual)20-- En la práctica: cherry-pick o WAP — Write-Audit-Publish
Branching y tagging en Iceberg: experimentar sin riesgo, marcar puntos importantes
El patrón Write-Audit-Publish (WAP) es la aplicación más importante del branching: escribes datos a un branch, ejecutas validaciones de calidad sobre ese branch, y solo si pasan TODAS las validaciones, publicas (merge) al main. Si fallan, simplemente borras el branch. Los lectores nunca vieron datos incorrectos.
WAP (Write-Audit-Publish) es el patrón que recomiendo a todos los equipos que tienen problemas de calidad de datos. Es como un Pull Request para datos: escribes, revisas, y solo mergeas si todo está bien. Elimina el problema de "datos malos llegaron a producción".
## ejercicios
Simular time travel con Python
Implementa una clase que simule time travel sobre un DataFrame — con historial de snapshots, consulta por versión y rollback.
Auditoría temporal: detectar qué cambió
Escribe funciones que comparen dos versiones de datos y reporten exactamente qué filas se añadieron, eliminaron o modificaron.
Diseñar política de retención de snapshots
La empresa necesita una política de retención de snapshots equilibrada entre coste de almacenamiento y capacidad de rollback. Diseña la política y calcula su impacto.
Implementar el patrón Write-Audit-Publish
Implementa una simulación del patrón WAP: escribe a un branch staging, ejecuta validaciones, y solo publica si pasan.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...