An open table format for huge analytic datasets that brings warehouse-like features (ACID transactions, time travel, schema evolution) to data lakes.
Apache Iceberg has become the de facto open table format for the modern lakehouse. Created at Netflix in 2017 and now a Apache top-level project, it solves the reliability problems that made earlier data lakes (Hive Metastore + Parquet folders on S3) unusable in production: no ACID, no safe concurrent writes, partition-change-requires-rewrite, corrupted tables from failed jobs. In 2026, every major cloud warehouse and compute engine supports Iceberg natively: Snowflake Iceberg tables, Databricks Iceberg support via Uniform, BigQuery external Iceberg tables, AWS S3 Tables (native Iceberg managed service), Trino, Spark, Flink, DuckDB, ClickHouse, Dremio — the list keeps growing. The ecosystem consolidation around Iceberg is the single most important trend in data engineering this decade because it means "pick any engine, read/write the same tables" actually works now.
Four things that fundamentally didn't exist on data lakes before: (1) ACID — concurrent writes serialize via optimistic concurrency control on the catalog, no more corrupted tables from race conditions; (2) Time travel — every write creates a snapshot; query any past state with FOR VERSION AS OF or FOR TIMESTAMP AS OF; (3) Schema evolution — rename, drop, reorder, widen columns as metadata-only operations (stable column IDs, not names or positions); (4) Partition evolution — change partitioning from month to day without rewriting a single data file. Add hidden partitioning (PARTITIONED BY (month(ts)) without adding a month column), per-file statistics for pruning, and REST Catalog for engine-neutral discovery, and Iceberg is basically what a data warehouse gives you on open files.
A media company had 240TB of Parquet on S3 with Hive partitions (year/month/day), partition repair jobs that took 2 hours, and chronic issues where Spark jobs writing overlapping partitions produced inconsistent Athena results. We migrated to Iceberg using the migrate-in-place procedure (CALL system.register_table) — no data copy needed, just rewrote the metadata layer. Writes became ACID, Athena/Trino/Snowflake all queried the same tables with consistent results, and partition evolution let us transparently shift from day to hour partitioning for hot tables without touching existing files. AWS Glue catalog held the metadata. Storage cost unchanged (same Parquet files); reliability went from "three incidents per week" to zero in 6 months. The 4-week migration paid back in quarter 2.
Apache Iceberg is an open table format designed for petabyte-scale analytic datasets. Created at Netflix, it solves the fundamental problems that made data lakes unreliable — by bringing ACID transactions, time travel, schema evolution, and partition evolution to files sitting in object storage (S3, GCS, ADLS).
Traditional data lakes stored data as raw files (Parquet/ORC) with a Hive Metastore tracking partitions. This architecture had critical flaws:
Query Engine (Spark/Trino/Flink)
│
▼
┌─────────────────┐
│ Iceberg Catalog │ (Where is the latest table state?)
│ (REST/Glue/Nessie)│
└────────┬────────┘
│
┌────────▼────────┐
│ Metadata Layer │ (Manifest files + Manifest Lists)
│ - Snapshots │
│ - Manifests │
│ - Statistics │
└────────┬────────┘
│
┌────────▼────────┐
│ Data Files │ (Parquet/ORC/Avro in S3/GCS/ADLS)
└─────────────────┘-- Query data as it was 24 hours ago
SELECT * FROM orders
FOR SYSTEM_TIME AS OF TIMESTAMP '2026-02-26 09:00:00';
-- Roll back to a previous snapshot
ALTER TABLE orders ROLLBACK TO SNAPSHOT 12345;| Feature | Iceberg | Delta Lake | Hudi |
|---|---|---|---|
| Governance | Apache Foundation | Databricks | Apache Foundation |
| Engine Lock-in | None | Spark-first | Spark-first |
| Partition Evolution | ✅ Best-in-class | ❌ | Partial |
| Catalog Options | REST, Glue, Nessie, Polaris | Unity Catalog | Hive Metastore |
| Adoption Trend | 📈 Fastest growing | 📈 Strong (Databricks) | ➡️ Stable |
Iceberg gotchas encountered running it in production:
metadata.json + manifest list + manifests. Long-running tables accumulate thousands of metadata files. Run expire_snapshots and remove_orphan_files on a schedule (daily/weekly) or planning time degrades.rewrite_data_files compaction to target 256MB-1GB files; without it, scan performance collapses.PARTITIONED BY (month(ts)) adds a partition column derived from ts, but queries must still filter on ts for pruning to engage — Iceberg translates ts filters to month-partition filters automatically. Queries filtering on an unrelated column don't benefit.day to hour applies to NEW writes only. Old data stays in its original layout; queries crossing the boundary read both layouts. Plan migration cutover explicitly.DELETE FROM t WHERE ... logically removes rows, but physically the files stay until expire_snapshots removes unreferenced ones. GDPR deletion compliance requires both the logical delete AND explicit snapshot expiration within the compliance window.Apache Iceberg is a table format used to manage petabyte-scale analytical datasets in data lakes and lakehouses. It organizes Parquet (or ORC/Avro) files into logical, transactional tables with ACID guarantees, snapshot-based versioning, schema evolution, and hidden partitioning. Common uses: (1) lakehouse primary storage where multiple engines (Spark, Trino, Snowflake, Databricks) read/write the same tables; (2) data lake modernization replacing Hive Metastore + raw Parquet; (3) time-travel-enabled data science workflows for reproducible ML training; (4) large-scale streaming ingest sinks (Flink → Iceberg → downstream consumers); (5) CDC-style MERGE workloads on object storage; (6) regulated industries needing auditable, reproducible historical data via snapshots. In 2026, Iceberg is the default open table format for new lakehouse projects.
Depends on your stack. Iceberg advantages: engine-neutral — designed from day one for multi-engine use (Spark, Trino, Flink, Snowflake, BigQuery, DuckDB all have first-class support); partition evolution (change partitioning without rewriting files); hidden partitioning; REST Catalog for catalog interoperability; stronger governance story for multi-vendor environments; strongest 2024-2026 community and industry momentum. Delta Lake advantages: tighter Databricks Spark integration (best Structured Streaming support); mature deletion vectors and liquid clustering (Databricks-optimized); simpler mental model for Spark-only shops; Unity Catalog as turnkey governance. Rule of thumb: Databricks-centric shop → Delta makes sense; anything else (Snowflake + Spark, multi-vendor, cloud-provider-neutral) → Iceberg is the better default in 2026.
Yes, with full read/write support. Snowflake offers two Iceberg table modes: (1) Snowflake-managed Iceberg — Snowflake manages the catalog, metadata, and Parquet files on your S3/ADLS/GCS bucket; you get near-internal-table performance with open format; (2) Externally-managed Iceberg — you (or another engine) manage the catalog via AWS Glue, Polaris, or REST Catalog; Snowflake reads/writes the same tables other engines are touching. Snowflake also contributed heavily to Apache Polaris, the open-source Iceberg REST catalog. With Iceberg tables, you get Snowflake's query engine on your own storage, and other engines (Spark, Databricks, Trino) can access the same data through the shared catalog. This is central to Snowflake's open-data strategy for 2025-2026.
Parquet is a **file format**: how bytes within a single file are encoded (columnar layout, compression, row groups, per-column statistics). A `.parquet` file is standalone-readable by any Parquet-aware library. Iceberg is a **table format**: how multiple Parquet files (or ORC/Avro) are organized into a logical table with a transaction log, snapshots, schema metadata, partition layout, and per-file pruning statistics. Iceberg tables store their DATA as Parquet files plus METADATA files (manifest lists, manifests, metadata.json) describing the table. You can think of Parquet as the pages of a book and Iceberg as the table of contents + version history + edition markers. Iceberg without Parquet: impossible (needs a file format). Parquet without Iceberg: possible but no ACID, no schema evolution, no time travel.
The Iceberg REST Catalog is an open, standardized HTTP API (defined 2023) that lets any engine discover, read, and write Iceberg tables through a single interface, regardless of the underlying catalog implementation. Before REST Catalog, each engine needed custom adapters for each catalog (Hive, Glue, Nessie, Unity). With REST Catalog, engines speak one protocol, and catalog vendors (Apache Polaris, Snowflake-managed Polaris, Databricks Unity REST, Nessie, Tabular, custom catalogs) implement that protocol — so switching catalogs becomes an operational change, not a code change. It's the key enabler for truly multi-engine lakehouse governance: centralize RBAC and table discovery in the catalog; let engines come and go. As of 2026, REST Catalog adoption is accelerating rapidly and is the recommended default for new Iceberg deployments.
Two migration patterns, both in-place (no data copy). (1) Register existing Parquet — `CALL catalog.system.register_table('schema.table', 's3://bucket/path')` — Iceberg scans the existing files and creates an initial snapshot pointing at them. Works when existing files are already well-organized (Hive-partitioned or flat). (2) Migrate Hive tables — `CALL catalog.system.migrate('hive_table_name')` — converts a Hive Metastore table to Iceberg in place, preserving data files and partition layout. After migration, all new writes go through Iceberg (ACID); existing readers using Hive-style paths continue to work during transition. Plan: run migration in dev, verify catalog functionality, cut writers over one at a time, deprecate old Hive Metastore readers, expire old metadata. For 100TB+ tables, the migration itself takes minutes (metadata-only); the team coordination takes weeks.
Four routine maintenance jobs, typically scheduled in Airflow/Dagster or as catalog-side automated tasks. (1) `expire_snapshots(older_than => '7 days')` — drops old snapshots and the metadata files they reference; required to keep metadata size bounded and to physically release deleted data for compliance. (2) `rewrite_data_files` (compaction) — merges small files into target-sized files (256MB-1GB), massively improving read performance; run after heavy streaming writes or daily on active tables. (3) `rewrite_manifests` — consolidates many small manifests into fewer large ones, speeding up planning; run weekly on large tables. (4) `remove_orphan_files(older_than => '3 days')` — cleans up data files not referenced by any snapshot (from failed writes); run weekly. AWS S3 Tables, Snowflake-managed Iceberg, and Databricks Predictive Optimization handle most of this automatically. Self-managed Iceberg requires explicit scheduling.