Construcción de Tablas Iceberg

Diseña y opera tablas Apache Iceberg: particionamiento y particionamiento oculto, evolución de esquemas/particiones, instantáneas y viaje en el tiempo, compactación y limpieza de archivos pequeños, y MERGE/upsert para tablas lakehouse en Spark, Flink, Trino o Snowflake.

¿Qué es Construcción de Tablas Iceberg?

Este skill está diseñado para desarrolladores e ingenieros de datos que trabajan con tablas Apache Iceberg en un entorno lakehouse (data lakehouse). Proporciona una guía clara sobre cómo crear y mantener tablas Iceberg, enfocándose en el particionamiento oculto mediante transformaciones (como `days(ts)` o `bucket(N, id)`) para que las consultas se beneficien de la poda de particiones sin necesidad de columnas derivadas explícitas. También cubre la ingesta idempotente usando `MERGE INTO` con una clave de negocio, la compactación regular de archivos pequeños mediante `rewrite_data_files`, y la gestión de metadatos expirando instantáneas viejas y eliminando archivos huérfanos. Una de las ventajas clave de Iceberg que resalta es la evolución flexible de esquemas y particiones, que no requiere reescritura de datos, lo que permite cambios seguros en tablas en producción. El skill incluye ejemplos prácticos de SQL para Spark, abarcando desde la creación de tablas hasta tareas de mantenimiento y viaje en el tiempo (`VERSION AS OF`), y advierte sobre errores comunes como la falta de compactación en tablas de streaming, la sobredimensionación del particionamiento o el uso incorrecto de `MERGE`.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Unknown-333/awesome-data-engineering-skills/tree/main/skills/building-iceberg-tables

Installed? Explore more Investigación y análisis de datos skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace Construcción de Tablas Iceberg?

Cuándo usar

  • Crear o mantener tablas Apache Iceberg en un lakehouse.
  • Elegir particionamiento, o evolucionar esquemas/particiones sin necesidad de reescrituras.
  • Gestionar instantáneas, viaje en el tiempo, compactación y archivos pequeños.
  • NO usar para tareas específicas de Delta (usar engineering-databricks-pipelines).

Flujo de trabajo

- [ ] Particionar por columnas de filtro de consulta; usar transformaciones de partición ocultas
- [ ] Usar MERGE para upserts idempotentes
- [ ] Programar compactación (rewrite_data_files) para corregir archivos pequeños
- [ ] Expirar instantáneas antiguas + eliminar archivos huérfanos para controlar metadatos/almacenamiento
- [ ] Evolucionar particionamiento/esquema por ID de campo (sin reescritura de datos)
  1. Particionar en columnas de filtro usando transformaciones de partición ocultas (days(ts), bucket(N, id)), para que las consultas poden sin que los usuarios añadan columnas de partición derivadas.
  2. Escrituras idempotentes mediante MERGE INTO con clave basada en la clave de negocio.
  3. Compactar regularmente — las escrituras en streaming o en pequeños lotes crean muchos archivos pequeños; rewrite_data_files restaura el rendimiento de lectura.
  4. Mantener metadatos — expirar instantáneas antiguas y eliminar archivos huérfanos, o el historial de instantáneas y el almacenamiento crecerán sin límite.
  5. Evolucionar libremente — Iceberg rastrea columnas/particiones por ID, por lo que agregar, eliminar, renombrar e incluso cambios en la especificación de particiones no requieren reescritura de datos.

Patrones

Crear con particionamiento oculto + upsert MERGE:

CREATE TABLE lake.db.orders (order_id BIGINT, customer_id BIGINT, amount DECIMAL, ordered_at TIMESTAMP)
USING iceberg PARTITIONED BY (days(ordered_at));

MERGE INTO lake.db.orders t USING staging s ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

Mantenimiento (procedimientos de Spark):

CALL lake.system.rewrite_data_files('db.orders');       -- compactar archivos pequeños
CALL lake.system.expire_snapshots('db.orders', TIMESTAMP '2026-08-01 00:00:00');
CALL lake.system.remove_orphan_files(table => 'db.orders');

Viaje en el tiempo — leer una instantánea anterior para auditoría o recuperación: SELECT * FROM lake.db.orders VERSION AS OF <snapshot_id>.

Evolución de particiones — ALTER TABLE ... ADD PARTITION FIELD bucket(16, customer_id) se aplica solo a los nuevos datos; los datos antiguos siguen siendo válidos.

Errores comunes

  • Sin compactación en tablas de streaming — la explosión de archivos pequeños perjudica la velocidad de lectura.
  • Nunca expirar instantáneas — los metadatos y el almacenamiento crecen sin límite; programa la expiración dentro de tu período de retención de viaje en el tiempo.
  • Sobredimensionamiento del particionamiento (p. ej., por hora en volúmenes bajos) — demasiadas particiones diminutas; iguala la granularidad al tamaño de los datos.
  • Añadir columnas de partición derivadas explícitas — va en contra del propósito del particionamiento oculto; usa transformaciones.
  • Sobrescritura ciega en lugar de MERGE — pierde idempotencia; usa MERGE por clave.
  • Eliminar archivos huérfanos con una ventana demasiado corta — puede eliminar archivos que los escritores activos aún necesitan; usa un límite de tiempo seguro.

Individual skills in this repo

This repo contains 9 individual skills — each has its own dedicated page.

Unknown-333/authoring-airflow-dags

Write production-grade Apache Airflow DAGs using the TaskFlow API — idempotent tasks, correct scheduling and catchup, retries/SLAs, connections/variables, and avoiding top-level code. Use when creating or reviewing Airflow DAGs, scheduling pipelines, wiring task dependencies, configuring retries/backfills, or fixing non-idempotent tasks.

Unknown-333/building-dagster-assets

Build Dagster pipelines using software-defined assets — asset dependencies, partitions, resources and IO managers, asset checks, and schedules/sensors. Use when creating Dagster assets or jobs, modeling data as assets, adding partitions or backfills, wiring resources/IO managers, or migrating from task-based orchestration to assets.

Unknown-333/building-dbt-models

Build well-structured dbt models — staging/intermediate/marts layers, ref() and source(), materializations, and incremental models with the right strategy. Use when creating or refactoring dbt models, choosing table vs view vs incremental, structuring a dbt project, or writing incremental logic.

Unknown-333/building-feature-pipelines

Build ML feature pipelines and feature stores — point-in-time-correct joins to avoid label leakage, offline/online parity, feature freshness and backfills, and materialization with tools like Feast. Use when engineering features for ML, preventing train/serve skew or data leakage, building a feature store, or backfilling historical features for training.

Unknown-333/building-ingestion-pipelines

Build batch and incremental data ingestion (extract-load) pipelines — full vs incremental extraction, change data capture (CDC), watermarks and high-water marks, API pagination and rate limits, and choosing managed EL tools (Fivetran, Airbyte) vs custom code. Use when ingesting data from databases, APIs, files, or SaaS into a warehouse/lake, or designing incremental extraction and CDC.

Unknown-333/building-kafka-consumers

Build reliable Apache Kafka consumers and producers — consumer groups and partition assignment, offset commit strategy, at-least-once vs exactly-once, idempotent/transactional producers, rebalancing, and dead-letter handling. Use when writing Kafka consumers/producers, configuring offset commits or consumer groups, tuning throughput, or handling rebalances and poison messages.

Unknown-333/debugging-data-pipelines

Systematically root-cause data pipeline failures and data incidents — job errors, wrong or missing data, duplicates, and freshness misses — by tracing lineage upstream, isolating the failing stage, reconciling against source, and planning a safe fix and backfill. Use when a pipeline fails, numbers look wrong, data is missing or duplicated, a dashboard is stale, or a stakeholder reports a data discrepancy.

Unknown-333/designing-backfills-and-replays

Plan and run safe data backfills and replays — idempotent reprocessing of historical windows, partition-by-partition execution, isolating backfill compute from production, verifying results, and avoiding double-counting or changed history. Use when backfilling a new or fixed model, reprocessing after a bug, replaying events, or loading history for a new pipeline without corrupting existing data.

Unknown-333/designing-data-contracts

Define and enforce data contracts between producers and consumers — explicit schema, semantics, ownership, SLAs, and versioning — to prevent silent upstream changes from breaking downstream pipelines. Use when a producer schema change could break consumers, defining an interface between teams/services and the warehouse, or adding schema enforcement at ingestion.

Skills relacionados