DuckLake or Iceberg?
| Dimension | DuckLake | Apache Iceberg |
|---|---|---|
| In one line | Table metadata as rows in a SQL database, data as Parquet files | Table metadata as a tree of JSON and Avro files next to the data, found through a catalog |
| Where metadata lives | Ordinary tables in a catalog database: PostgreSQL for many users, SQLite or a DuckDB file locally; MySQL works but isn’t recommended | Files in object storage: a metadata JSON file, manifest lists and Avro manifests; the catalog stores only the location of the current metadata file |
| Commit path | One database transaction. Snapshot ids are a primary key, so of two clashing writers one fails, then retries without rewriting data files unless the changes really conflict | Write data files and new metadata files, then swap the catalog’s pointer atomically; if another commit got there first, retry against the new snapshot |
| Changes across tables | Atomic, through the database’s own transactions | Atomic only through a REST catalog’s multi-table commit endpoint, where the catalog implements it |
| Small writes | Inlined: inserts and deletes of up to 10 rows by default are stored in the catalog database and flushed to Parquet later, for example by CHECKPOINT | Every commit writes at least one data file plus new metadata files, so frequent small commits pile up files until compaction runs |
| Deletes and updates | A positional delete file in Parquet per affected data file; deletion vectors in Puffin files are experimental in 1.0 | Copy-on-write rewrites, or merge-on-read with position or equality delete files (v2) and deletion vectors in Puffin files (v3) |
| Catalog | The catalog database is the catalog; there is no separate service to run | A separate catalog to choose and run: a REST catalog such as Polaris or Lakekeeper, AWS Glue, Nessie or a JDBC database |
| Engines | DuckDB’s ducklake extension is the reference; DataFusion, Spark (from MotherDuck) and two Trino implementations come from others | Spark, Flink, Trino, DuckDB, ClickHouse, Snowflake, BigQuery, Athena, Redshift and many more |
| Maintenance | Merge adjacent files, expire snapshots, delete old files and rewrite files with many deletes; CHECKPOINT runs them together. Vacuum the catalog database now and then | Compact data files, rewrite delete files, expire snapshots and remove orphan files, on a schedule or through a managed service |
| What limits scale | The catalog database’s performance, according to the FAQ | Metadata reads and commit conflicts: many snapshots and manifests slow planning, and many writers to one table retry |
| Interoperability | Copies tables to and from Iceberg since 0.3; bucket partitioning uses Iceberg’s murmur3 hashing | XTable can translate its metadata to and from Delta Lake and Hudi |
| Maturity | Announced in May 2025; 1.0 in April 2026 with a backward-compatibility guarantee | Started at Netflix in 2017, Apache top-level project since 2020; spec versions 1 to 3 complete, 4 in development |
| Licence and governance | MIT, for both the spec and the DuckDB extension; developed by the DuckDB team | Apache 2.0; an Apache Software Foundation project |
Rule of thumb
Pick DuckLake when DuckDB is your main engine and you already run PostgreSQL: there is no catalog service, small writes are cheap and multi-table transactions come free. Pick Iceberg when many engines and cloud services must read and write the same tables. The choice isn’t final: both keep data as Parquet, and DuckLake can copy tables out to Iceberg.
Sources
- The DuckLake manifesto: metadata in SQL, data in Parquet, multi-table transactions
- DuckLake: SQL as a Lakehouse Format (May 2025)
- DuckLake FAQ (catalog database as the only limit; MIT licence)
- DuckLake docs: Choosing a catalog database (DuckDB, SQLite, PostgreSQL, MySQL)
- DuckLake docs: Conflict resolution (snapshot id primary key, retries)
- DuckLake docs: Data inlining (10-row default, flushing)
- DuckLake spec: ducklake_delete_file (Parquet positional deletes, experimental Puffin)
- DuckLake docs: Recommended maintenance
- DuckLake v1.0 (engines, bucket partitioning, deletion vectors, backward compatibility)
- DuckLake 0.3: Iceberg interoperability (September 2025)
- Iceberg table spec: metadata tree, optimistic commits, row-level deletes, format versions
- Iceberg REST catalog spec (commitTransaction for multi-table commits)
- Iceberg docs: Vendors and third-party integrations
- Iceberg docs: Maintenance (expire snapshots, compaction, orphan files)
- Apache Incubator: Iceberg incubation status (graduated May 2020)
- XTable docs: Features and limitations