Construction de tables Iceberg

Concevoir et exploiter des tables Apache Iceberg — partitionnement et partitionnement caché, évolution du partitionnement/schéma, instantanés et voyage dans le temps, compactage et nettoyage des petits fichiers, et MERGE/upsert pour les tables lakehouse sur Spark, Flink, Trino ou Snowflake.

Qu'est-ce que Construction de tables Iceberg ?

Cette compétence guide les développeurs et ingénieurs de données dans la conception et l'exploitation de tables Apache Iceberg dans un environnement lakehouse. Elle couvre l'ensemble du cycle de vie : création de tables avec partitionnement caché, écritures idempotentes via MERGE INTO, compactage régulier des petits fichiers avec rewrite_data_files, gestion des instantanés et voyage dans le temps pour l'audit et la récupération, ainsi que l'évolution du schéma et du partitionnement sans réécriture des données. La compétence précise les cas d'utilisation (création, maintenance, optimisation) et les pièges courants comme l'absence de compactage, l'expiration des instantanés ou le sur-partitionnement. Elle est destinée aux plateformes compatibles Iceberg (Spark, Flink, Trino, Snowflake) et fournit des exemples concrets de code SQL et de procédures Spark.

Compatible avec~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 Recherche et analyse de données skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait Construction de tables Iceberg ?

Quand l'utiliser

  • Création ou maintenance de tables Apache Iceberg sur un lakehouse.
  • Choix du partitionnement, ou évolution du partitionnement/schéma sans réécriture.
  • Gestion des instantanés, voyage dans le temps, compactage et petits fichiers.
  • Ne PAS utiliser pour du travail spécifique à Delta (utiliser engineering-databricks-pipelines).

Workflow

- [ ] Partitionner par colonnes de filtre de requête ; utiliser les transformations de partition cachées
- [ ] Utiliser MERGE pour les upserts idempotents
- [ ] Planifier le compactage (rewrite_data_files) pour corriger les petits fichiers
- [ ] Expirer les anciens instantanés + supprimer les fichiers orphelins pour contrôler les métadonnées/le stockage
- [ ] Faire évoluer le partitionnement/le schéma par ID de champ (aucune réécriture de données)
  1. Partitionner sur les colonnes de filtre en utilisant des transformations de partition cachées (days(ts), bucket(N, id)), afin que les requêtes élaguent sans que les utilisateurs n'ajoutent de colonnes de partition dérivées.
  2. Écritures idempotentes via MERGE INTO basé sur la clé métier.
  3. Compacter régulièrement — les écritures streaming/petits lots créent de nombreux petits fichiers ; rewrite_data_files restaure les performances de lecture.
  4. Maintenir les métadonnées — expirer les anciens instantanés et supprimer les fichiers orphelins, sinon l'historique des instantanés et le stockage croissent sans limite.
  5. Évoluer librement — Iceberg suit les colonnes/les partitions par ID, donc ajouter/supprimer/renommer et même modifier la spécification de partition ne nécessite aucune réécriture de données.

Patterns

Création avec partitionnement caché + 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 *;

Maintenance (procédures Spark) :

CALL lake.system.rewrite_data_files('db.orders');       -- compacte les petits fichiers
CALL lake.system.expire_snapshots('db.orders', TIMESTAMP '2026-08-01 00:00:00');
CALL lake.system.remove_orphan_files(table => 'db.orders');

Voyage dans le temps — lire un instantané antérieur pour audit ou récupération : SELECT * FROM lake.db.orders VERSION AS OF <snapshot_id>.

Évolution du partitionnement — ALTER TABLE ... ADD PARTITION FIELD bucket(16, customer_id) s'applique uniquement aux nouvelles données ; les anciennes données restent valides.

Pièges courants

  • Absence de compactage sur les tables streaming — l'explosion des petits fichiers réduit les performances de lecture.
  • Ne jamais expirer les instantanés — les métadonnées et le stockage croissent sans limite ; planifiez l'expiration dans votre période de rétention du voyage dans le temps.
  • Sur-partitionnement (par exemple par heure sur un faible volume) — trop de petites partitions ; adaptez la granularité à la taille des données.
  • Ajout de colonnes de partition dérivées explicites — va à l'encontre du partitionnement caché ; utilisez les transformations.
  • Réécriture aveugle au lieu de MERGE — perd l'idempotence ; utilisez MERGE par clé.
  • Suppression des fichiers orphelins avec une fenêtre trop courte — peut supprimer des fichiers encore nécessaires aux écritures en cours ; utilisez une limite de sécurité.

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 associés