This repository contains an early exploration comparing three table formats on the same small analytics workload:
- DuckLake
- Apache Iceberg
- Delta Lake
The work focuses on:
- Loading the same Gapminder dataset into each format
- Running the same query patterns for fairness
- Building equivalent Dash apps for interactive exploration
- Capturing metadata and file layout artifacts for inspection
All implementation is in early-exploration/.
app.py: Dash app backed by DuckLakeapp_iceberg.py: Dash app backed by Apache Icebergapp_delta.py: Dash app backed by Delta Lakebenchmark.py: End-to-end benchmark script across all 3 formatsbenchmark_results.json: Saved benchmark outputducklake_catalog_dump/,iceberg_catalog_dump/,delta_catalog_dump/: Catalog and metadata inspection dumpsdata/,iceberg_data/,delta_data/: Data and metadata files generated by the runs
Source: early-exploration/benchmark_results.json
Using the committed run, each format started with 1704 rows, appended 100 rows, and ended with 1804 rows.
| Metric | DuckLake | Iceberg | Delta |
|---|---|---|---|
| Setup (ms) | 2443.17 | 951.22 | 4538.69 |
| Cold filter (ms) | 53.26 | 7.14 | 4.53 |
| Warm filter median (ms) | 30.48 | 3.8 | 3.17 |
| Cold aggregation (ms) | 10.99 | 7.32 | 4.68 |
| Warm agg median (ms) | 6.73 | 3.65 | 2.76 |
| Append 100 rows (ms) | 12.83 | 17.23 | 21.9 |
| Data files before/after | 1 -> 2 | 1 -> 2 | 1 -> 2 |
| Metadata size after (B) | 0 | 17952 | 2736 |
| Total size after (B) | 38841 | 57926 | 49911 |
Notes:
- Delta queries used DuckDB
delta_scanin this run (query_engine: duckdb_delta_scan). - Results are exploratory and environment-dependent, not a final performance claim.
early-exploration/benchmark.py measures:
- T1: cold filter query latency
- T2: warm filter query latency (median of 10 runs)
- T3: cold aggregation query latency
- T4: warm aggregation query latency (median of 10 runs)
- T5: append 100 rows latency
- M1: data file count before and after append
- M2: metadata and total on-disk size
All three formats use the same Gapminder CSV source and equivalent query shapes.
Example with Python venv:
cd early-exploration
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install dash plotly duckdb pandas pyarrow deltalake pyicebergDuckDB extensions are installed dynamically by scripts:
ducklakeextension for DuckLake app and benchmark sectiondeltaextension for Deltadelta_scanpath when available
From early-exploration/:
python app.pyDuckLake app runs on port 8050.
python app_iceberg.pyIceberg app runs on port 8051.
python app_delta.pyDelta app runs on port 8052.
From early-exploration/:
python benchmark.pyThis prints a comparison table and writes fresh JSON results to benchmark_results.json.
This is an early exploration checkpoint intended to support iterative analysis and thesis comparison work. The committed catalog dumps and table artifacts are included so metadata evolution and layout can be inspected directly.