Nº03 · Almacenamiento
Apache Iceberg
Tablas con garantías de base de datos sobre tu data lake.
Apache Iceberg es un formato de tabla abierto diseñado para trabajar sobre sistemas de archivos distribuidos (S3, GCS, HDFS). A diferencia de guardar datos en Parquet suelto, Iceberg añade una capa de metadatos que habilita transacciones ACID, evolución de esquema y time travel sin mover ni reescribir tus archivos.
¿Qué es?
Iceberg define cómo se organizan y rastrean los archivos de datos (Parquet, ORC, Avro) en un lake. Su catálogo de metadatos es la pieza clave: registra cada snapshot de la tabla, qué archivos lo componen y cuál es el esquema en ese punto del tiempo. Esto convierte una colección de archivos en una tabla con comportamiento de base de datos:
- ACID — commits atómicos; ninguna lectura ve un estado a medias.
- Schema evolution — agrega, renombra o elimina columnas sin reescribir datos históricos.
- Time travel — consulta el estado de la tabla en cualquier snapshot anterior con
AS OF. - Partition evolution — cambia la estrategia de particionado sin migraciones manuales.
El formato es nativo en el ecosistema lakehouse y está soportado por Spark, Trino, Flink, DuckDB y otros motores.
¿Para qué sirve?
- Pipelines de ingesta con calidad garantizada. Escribe datos en lotes con commits atómicos; si algo falla, el snapshot anterior sigue intacto.
- Auditoría y rollback. Recupera el estado exacto de una tabla en un timestamp anterior sin backups adicionales.
- Plataformas analíticas multi-motor. Un mismo conjunto de archivos puede ser leído por Spark (ETL), Trino (SQL ad-hoc) y DuckDB (exploración local) sin duplicar datos.
¿Cuándo usarla / cuándo no?
Úsala cuando:
- Manejas tablas grandes (cientos de GB o más) que múltiples motores consultan.
- Necesitas garantías ACID sobre un data lake (auditoría, regulación, rollback).
- Tus esquemas cambian con frecuencia y no quieres reescrituras costosas.
Piénsalo dos veces cuando:
- El dataset es pequeño o lo lee un solo proceso — un Parquet plano es más simple y suficiente.
- Tu stack no incluye un motor compatible (Spark o Trino son los más maduros); sin un motor que entienda el catálogo Iceberg, el formato no aporta.
- Quieres resultados rápidos en local sin infraestructura; en ese caso empieza con DuckDB directamente.
Empieza en 1 minuto
Crea y lee una tabla Iceberg en local con pyiceberg (sin clúster Spark):
pip install "pyiceberg[duckdb,pyarrow]"
from pyiceberg.catalog.sql import SqlCatalog
import pyarrow as pa
# Catálogo local en SQLite
catalog = SqlCatalog(
"local",
**{
"uri": "sqlite:///iceberg_local.db",
"warehouse": "/tmp/iceberg_warehouse",
},
)
catalog.create_namespace("demo")
schema = pa.schema([
pa.field("id", pa.int64()),
pa.field("evento", pa.string()),
pa.field("ts", pa.timestamp("us")),
])
table = catalog.create_table("demo.eventos", schema=schema)
# Escribe datos
import pyarrow as pa
batch = pa.table({
"id": [1, 2, 3],
"evento": ["login", "compra", "logout"],
"ts": pa.array(
["2026-06-08T10:00:00", "2026-06-08T10:05:00", "2026-06-08T10:10:00"],
type=pa.timestamp("us"),
),
})
table.append(batch)
# Lee como DataFrame
df = table.scan().to_arrow()
print(df)
Para producción con Spark, consulta la guía oficial de configuración.
Trivia rápida — pon a prueba lo que acabas de leer.
¿Qué tanto sabes de Apache Iceberg?
Documentación oficial
La fuente de verdad vive ahí. Acá orientamos; la profundidad la pones tú.
Abrir documentación oficial ↗Qué aprender después
Ver tambiénNº03 · Actualizado 2026-06-08