Saltar al contenido

lección 7

Delta Lake y el ecosistema de table formats

Delta Lake en profundidad, MERGE INTO, vacuum, optimize, y comparación objetiva Delta vs Iceberg vs Hudi.

50 min

En la lección anterior exploramos Iceberg — el table format que nació en Netflix y se convirtió en estándar abierto. Pero no es el único. Delta Lake, creado por Databricks en 2019, fue el primero en popularizar la idea de "transacciones ACID sobre el data lake". Y aunque Iceberg ha ganado la guerra del ecosistema abierto, Delta Lake sigue siendo dominante en el universo Databricks — que es ENORME. Si trabajas con Databricks (y muchas empresas lo usan), Delta es tu formato nativo.

Igual que con Iceberg: esto es panorama, no dominio. El _delta_log, MERGE INTO, OPTIMIZE y VACUUM que verás aquí son para que RECONOZCAS las piezas y sepas cuándo entra cada una — no para que te las aprendas de memoria. El hands-on de Delta (crear tablas, ejecutar MERGE de verdad, OPTIMIZE/VACUUM sobre datos reales) requiere un entorno Spark o Databricks que no cabe en el navegador. Quédate con el mapa: qué es Delta, en qué se parece y en qué se diferencia de Iceberg, y cuándo elegir cada uno.

### Historia: por qué Databricks creó Delta Lake

Databricks tenía el mismo problema que Netflix: sus clientes usaban Spark sobre data lakes y sufrían escrituras parciales, datos corruptos, y falta de ACID. En 2019 lanzaron Delta Lake como proyecto open source. La filosofía de Delta es diferente a Iceberg: mientras Iceberg se diseñó como especificación vendor-neutral, Delta se diseñó como la capa de storage nativa de Databricks. Esto significa que Delta funciona mejor dentro del ecosistema Databricks, pero tiene menos soporte fuera de él.

### Cómo funciona Delta internamente

Delta Lake usa un "transaction log" — un directorio _delta_log/ dentro de la carpeta de la tabla con archivos JSON numerados secuencialmente. Cada archivo JSON es un commit que describe qué archivos se añadieron o eliminaron. Cada 10 commits se crea un "checkpoint" en formato Parquet para no tener que leer todos los JSONs desde el principio.

1# Estructura interna de una tabla Delta
2s3://lake/ventas_delta/
3 _delta_log/
4 00000000000000000000.json # Commit 0: CREATE TABLE
5 00000000000000000001.json # Commit 1: INSERT
6 00000000000000000002.json # Commit 2: UPDATE
7 ...
8 00000000000000000010.checkpoint.parquet # Checkpoint (resumen)
9 part-00000-xxx.snappy.parquet # Archivos de datos
10 part-00001-xxx.snappy.parquet
11 part-00002-xxx.snappy.parquet

Estructura de una tabla Delta: _delta_log/ contiene el historial de transacciones

### MERGE INTO: el arma secreta de Delta

MERGE INTO es la operación más usada en Delta Lake y resuelve uno de los problemas más comunes en ETL: "si el registro existe, actualízalo; si no existe, insértalo" (upsert). En un data lake tradicional sin table format, esto requería leer toda la tabla, hacer un left join con los datos nuevos, y reescribir todo. Con MERGE, Delta lo maneja eficientemente.

1-- MERGE INTO: upsert eficiente en Delta Lake
2MERGE INTO lake.clientes AS target
3USING staging.clientes_nuevos AS source
4ON target.cliente_id = source.cliente_id
5WHEN MATCHED THEN
6 UPDATE SET
7 target.nombre = source.nombre,
8 target.email = source.email,
9 target.actualizado_en = current_timestamp()
10WHEN NOT MATCHED THEN
11 INSERT (cliente_id, nombre, email, creado_en)
12 VALUES (source.cliente_id, source.nombre, source.email, current_timestamp())
13WHEN NOT MATCHED BY SOURCE AND target.activo = true THEN
14 UPDATE SET target.activo = false; -- Soft delete

MERGE INTO con las 3 cláusulas: matched, not matched, not matched by source

Nota importante: Iceberg también soporta MERGE INTO desde Spark 3.x. No es exclusivo de Delta. Pero Delta lo popularizó primero y su implementación está más optimizada en Databricks.

### OPTIMIZE y VACUUM: mantenimiento de tablas

Delta Lake tiene dos comandos de mantenimiento fundamentales:

  • OPTIMIZE: compacta archivos pequeños en archivos más grandes. Resuelve el small file problem. Puede incluir Z-ORDER para co-localizar datos que se filtran juntos.
  • VACUUM: elimina archivos de datos que ya no son referenciados por ninguna versión activa del log. Libera espacio en disco. Por defecto retiene 7 días para permitir time travel.
1-- OPTIMIZE: compactar small files
2OPTIMIZE lake.ventas;
3
4-- OPTIMIZE con Z-ORDER: co-localizar por columnas frecuentes en filtros
5OPTIMIZE lake.ventas
6 ZORDER BY (fecha, pais);
7
8-- VACUUM: eliminar archivos viejos (no referenciados)
9-- Retiene 168 horas (7 días) por defecto
10VACUUM lake.ventas;
11
12-- VACUUM agresivo (CUIDADO: pierdes time travel)
13VACUUM lake.ventas RETAIN 24 HOURS;
14
15-- Ver historial de la tabla
16DESCRIBE HISTORY lake.ventas;

Comandos de mantenimiento Delta: OPTIMIZE compacta, VACUUM limpia

VACUUM con retención menor a 7 días es peligroso: queries activas que leen archivos que VACUUM elimina pueden fallar. Y pierdes la capacidad de time travel a esos puntos. Solo reduce la retención si sabes exactamente lo que haces.

### Delta vs Iceberg: comparación objetiva

Iceberg lidera en ecosistema abierto; Delta domina en Databricks. Ambos resuelven los mismos problemas core.

### Apache Hudi: el tercer contendiente

Hay un tercer table format que merece mención: Apache Hudi (Hadoop Upserts Deletes Incrementals), creado por Uber en 2016. Hudi se enfoca en streaming e ingestión incremental — su punto fuerte es absorber CDC (Change Data Capture) de bases operacionales con baja latencia. Si tu caso de uso principal es "replicar una base de datos PostgreSQL al lake en near-real-time", Hudi es una opción sólida. Sin embargo, su ecosistema es más pequeño que Iceberg y Delta.

### El lakehouse: la convergencia final

El paradigma "lakehouse" es la convergencia natural de todo lo que hemos visto: un data lake (storage barato, formatos abiertos) + un table format (ACID, schema, time travel) + un motor de consultas rápido = un sistema que tiene las ventajas del lake Y del warehouse sin los inconvenientes de ninguno. Ya no necesitas un data lake para almacenar y un warehouse separado para consultar. El lakehouse hace ambas cosas.

En la práctica, un lakehouse es: archivos Parquet en S3 + Iceberg/Delta para ACID + Trino/Spark/DuckDB para consultas + un catálogo para descubrimiento. Los datos viven en un solo lugar (el lake), pero se comportan como una base de datos (transacciones, esquema, permisos).

Mi recomendación honesta en 2024: si usas Databricks, usa Delta (es su formato nativo y funciona increíblemente bien). Si NO usas Databricks, usa Iceberg. No pierdas tiempo evaluando los tres — la diferencia en features es mínima, pero la diferencia en soporte del ecosistema es enorme.

## ejercicios

[01]

Implementar MERGE (upsert) en Python

Simula la lógica de MERGE INTO de Delta Lake usando Pandas: si el registro existe actualízalo, si no insértalo.

Cargando editor...
[02]

Simular VACUUM: limpiar archivos huérfanos

Implementa la lógica de VACUUM: dado un historial de commits y los archivos referenciados, identifica cuáles se pueden eliminar de forma segura.

Cargando editor...
[03]

Decidir: ¿Iceberg, Delta o Hudi?

Te dan 4 escenarios empresariales. Para cada uno, recomienda el table format más adecuado y justifica tu decisión.

Cargando editor...
[04]

Simular Z-ORDER optimize

Z-ORDER co-localiza datos que se filtran juntos. Simula cómo la reordenación mejora el predicate pushdown al reducir el rango min/max por row group.

Cargando editor...

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...