Data Warehousing Updated: 2026-04-03

What is Table Format?

A layer that organizes files in a data lake into a structured table, enabling SQL-like features like ACID and time-travel.

From the field

Table formats are the most important piece of lakehouse infrastructure that most engineers still misunderstand. The confusion starts with the name — a "table format" is NOT a file format. Parquet is a file format (how bytes are laid out in one file); Iceberg / Delta Lake / Hudi are table formats (how many files are logically organized into one table, with transactions, versioning, and schema). A table in Iceberg is a pointer to a metadata tree that points to manifest files that point to data files (Parquet). Mutating the table means writing a new metadata tree and atomically swapping the pointer. That swap is what gives you ACID on top of eventually-consistent object storage — without which the lakehouse simply doesn't work.

Why this matters in 2026

Before table formats (pre-2018), doing MERGE on a data lake meant stopping all readers, rewriting the whole partition, hoping nothing failed mid-write, and restarting readers. Concurrent writes corrupted data. Schema changes required a full table rewrite. With Iceberg/Delta/Hudi: append a new snapshot, swap the metadata pointer, readers see old or new but never inconsistent data. Every modern lakehouse capability — time travel, hidden partitioning, incremental reads, compaction in place, schema evolution without rewrite — is a table-format feature, not a query-engine feature. Pick the format first; the engine is secondary.

Field story

A fintech client had 80TB of Parquet in S3 partitioned by day, with 6 Spark jobs writing nightly and Athena dashboards reading continuously. Every Friday (high-volume deploy day) they'd get corrupt dashboards because two jobs wrote overlapping partitions simultaneously, and readers saw partial results. They also couldn't fix schema bugs retroactively — renaming a column meant rewriting the entire history. We migrated to Iceberg on the same S3 bucket with AWS Glue as the catalog. No more corruption (Iceberg's snapshot isolation handles concurrent writes), schema evolution became a metadata-only operation (ALTER TABLE ... RENAME COLUMN is instant, no file rewrite), and they gained time travel (SELECT * FROM table FOR VERSION AS OF 123) for debugging pipeline bugs against yesterday's data. Six engineers stopped firefighting weekend data issues. The migration itself was ~6 weeks — not trivial, but pays back every week thereafter.

A Table Format is a metadata layer that sits on top of data files (like Parquet) in a data lake, organizing them into logical tables with warehouse-like capabilities. Without a table format, a 'table' in a data lake is just a folder of files with no transactional guarantees. Table formats solve this by tracking which files belong to a table, enabling ACID transactions, time travel, and schema evolution.

File Format vs Table Format

This distinction is critical and often confused:

ConceptExampleWhat It Does
File FormatParquet, ORC, AvroHow individual data files are encoded (columnar vs row, compression)
Table FormatIceberg, Delta Lake, HudiHow files are organized into tables (metadata, transactions, versioning)
Parquet tells you how to read one file. Iceberg tells you which Parquet files make up a table and tracks changes across them.

How Table Formats Work

Query Engine (Spark, Trino, Flink)
        ↓
Table Format Metadata Layer
  - Snapshot: list of all data files in current version
  - Manifest: statistics about each data file
  - Schema: column names, types, evolution history
        ↓
Data Files (Parquet/ORC on S3/GCS/ADLS)

Every write creates a new snapshot pointing to a new set of files. Old snapshots remain accessible for time travel.

Key Features All Table Formats Provide

  • ACID Transactions: Writes either fully succeed or fully fail — no corrupt partial states
  • Time Travel: Query data as it existed at any previous snapshot
  • Schema Evolution: Add, drop, rename columns without rewriting data
  • Partition Evolution: Change partitioning strategy without rewriting data (Iceberg)
  • Concurrent Writes: Multiple writers can safely write simultaneously

The Big Three: Iceberg vs Delta Lake vs Hudi

FeatureApache IcebergDelta LakeApache Hudi
Created byNetflixDatabricksUber
Engine SupportSpark, Trino, Flink, Snowflake, BigQuerySpark (best), Trino, FlinkSpark, Trino, Flink
Partition EvolutionYes (hidden)No (requires rewrite)Partial
Catalog OptionsREST, Glue, Hive, NessieUnity Catalog, HiveHive
Best ForMulti-engine, open ecosystemDatabricks shopsCDC + incremental
Schema EvolutionExcellentGoodGood
Community MomentumHighest (2024-2026)Strong (Databricks)Moderate

Choosing a Table Format

  • Apache Iceberg: Best default choice — widest engine support, best partition evolution, adopted by Snowflake, BigQuery, AWS, and Databricks
  • Delta Lake: Best if you are all-in on Databricks — tight Spark integration, Unity Catalog governance
  • Apache Hudi: Best if your primary use case is CDC / incremental upserts from databases

Key Points

Gotchas

Table format pitfalls that break production lakehouses:

  • Treating file format as table format. Writing Parquet directly to S3 and calling it a table is not a lakehouse — there's no transaction log, no snapshot isolation, no catalog awareness. Pick Iceberg, Delta, or Hudi from day one for any production table that gets writes.
  • Mixing catalog implementations. Iceberg supports multiple catalogs (REST, Glue, Hive, Nessie, Unity) — picking one and standardizing is critical. Tables created in one catalog aren't visible from another without migration.
  • Metadata file explosion. Every write creates a new manifest and a new snapshot. Without periodic expire_snapshots + remove_orphan_files (Iceberg) or VACUUM (Delta), metadata grows unboundedly, slowing planning and inflating storage cost.
  • Small-files compounding. Streaming writes create thousands of small Parquet files per partition. Without scheduled compaction (rewrite_data_files, OPTIMIZE), query performance degrades 10-50x over weeks.
  • Concurrent write failures. Two jobs writing to the same partition simultaneously cause one to fail with a commit conflict. Build retry logic, or partition writes so they don't overlap; Hudi handles concurrent updates better with MVCC, but Iceberg/Delta need retries at the app layer.
  • Version-pinning mismatches between engines. Engine A writes Iceberg v2 with row-level deletes; engine B reads with an older library that doesn't understand delete files → returns wrong results. Keep Iceberg/Delta library versions aligned across all writers and readers.
  • Vendor-specific extensions silently lock you in. Delta Lake has deletion vectors, column mapping, and liquid clustering that only Databricks fully supports; other engines read a degraded view. Iceberg has fewer such extensions. Audit which features you're using before claiming "vendor-neutral."
  • Hidden partitioning doesn't help old queries. Iceberg's hidden partitioning lets you partition by month(ts) without adding a column, but queries still need to filter on ts — engines do the partition translation. Adding partitioning to an existing table doesn't retroactively partition existing files.
  • Rollback isn't a free escape hatch. Time travel reads old snapshots, but rolling back to an old snapshot (making it the current) abandons all writes since — including other teams' writes. Rollback needs coordination across the whole pipeline.
  • Schema evolution edge cases. Adding a column is safe everywhere. Renaming needs column IDs (Iceberg handles; Delta needs column mapping enabled at creation). Dropping a column in Hudi is more complex. Type widening (int → bigint) works; narrowing doesn't. Test schema changes in a copy before applying to production.

Frequently Asked Questions

What is a table format in a data lake?

A table format is a metadata layer that turns a folder of data files (Parquet/ORC on S3/GCS/ADLS) into a logical, transactional table. It tracks: which files belong to the current version of the table (via a snapshot manifest), the table's schema and its evolution history, partition layout, per-file statistics (min/max/null-count) for query planning, and a transaction log of all commits. Every write produces a new snapshot pointing at a new file list, committed atomically via a catalog. Old snapshots stay queryable for time travel until expired. The three major table formats are Apache Iceberg, Delta Lake, and Apache Hudi. They all solve the same core problem (ACID on object storage) but differ in ecosystem, governance model, and optimization strategy. A table format is what makes a "lakehouse" distinct from a "data lake."

What is the difference between Parquet and Iceberg?

Parquet is a **file format**: it specifies how bytes within a single file are encoded — columnar layout, compression (Snappy/ZSTD), row groups, column statistics. A `.parquet` file is self-describing and can be read standalone by Spark, Pandas, DuckDB, etc. Iceberg is a **table format**: it specifies how multiple Parquet files are organized into a logical table, with a transaction log, snapshots, schema evolution history, and per-file pruning statistics. Iceberg doesn't replace Parquet; Iceberg tables store their data AS Parquet files (or ORC/Avro), plus metadata files that describe the table structure. Analogy: Parquet is how one page of a book is typeset; Iceberg is the book's index, table of contents, and edition history.

Should I use Iceberg or Delta Lake or Hudi?

Choose Iceberg (2026 default for most greenfield lakehouses) if: you need multi-engine support (Spark + Trino + Snowflake + Flink + DuckDB), you want engine-neutral governance, you value open/vendor-agnostic format, you're using Snowflake/AWS/Dremio alongside Spark. Choose Delta Lake if: you use Databricks as primary compute, you want the most mature Spark Structured Streaming integration, you benefit from Databricks-specific features (deletion vectors, liquid clustering, predictive optimization), single-engine (Databricks) or single-Spark shops. Choose Hudi if: your primary workload is incremental CDC upserts at high rate (every few minutes), you need record-level deduplication and compaction by default, you're building streaming-first pipelines. In 2026: Iceberg has the strongest community momentum and ecosystem; Delta is locked to Databricks-flavored tooling; Hudi is niche but strong for its use case.

Do I need a table format for my data lake?

If your data lake has any of: (1) concurrent writes from multiple jobs, (2) updates or deletes (not just appends), (3) schema changes over time, (4) more than one query engine accessing the same data, (5) compliance requirements (audit trail, time travel, reproducibility), (6) hundreds of partitions or thousands of files per table — then yes, you need a table format. A raw-Parquet-on-S3 "lake" works for append-only single-writer pipelines but falls apart as soon as multiple jobs, schema changes, or ACID needs appear. In 2026, treating table formats as optional is an anti-pattern; Iceberg/Delta/Hudi are as fundamental to modern lakes as schemas are to relational databases. The cost is minimal (Iceberg adds ~2-5% metadata overhead); the benefit is avoiding corrupt-data incidents that take weeks to untangle.

How do table formats provide ACID transactions on object storage?

The trick is atomic metadata pointer swaps. Object stores (S3, GCS, ADLS) don't support multi-object transactions, but they DO support atomic single-object writes (or conditional puts). A table format keeps the table's "current state" as a single metadata file (Iceberg: the `metadata.json` pointer, Delta: the `_delta_log` latest version, Hudi: the timeline). A commit writes new data files, then writes a new metadata file, then atomically updates the table pointer (via catalog atomic compare-and-swap, or S3 conditional write). Readers always resolve the pointer first and see a consistent snapshot. Concurrent writers check the pointer before committing — if it's changed, they retry (optimistic concurrency). The result: full ACID on top of eventually-consistent object storage, with no distributed-lock service.

What is time travel and when do you use it?

Time travel lets you query a table as it existed at a past snapshot. Iceberg: `SELECT * FROM t FOR VERSION AS OF 123` or `FOR TIMESTAMP AS OF '2026-01-15'`. Delta: `SELECT * FROM t VERSION AS OF 5` or `TIMESTAMP AS OF '2026-01-15'`. Hudi: `SELECT * FROM t TIMESTAMP AS OF '20260115120000'`. Use cases: (1) debugging — reproduce yesterday's dashboard numbers to figure out what changed; (2) point-in-time ML training — train models on historical feature snapshots without leakage; (3) auditability — show regulators what data looked like at transaction time; (4) rollback — restore a table to before a bad write. Caveats: time travel only works for snapshots not yet expired (default Iceberg: 5 days); it's read-only (you can't mutate past snapshots); heavy use can prevent garbage collection of old files, bloating storage. Configure `expire_snapshots` to match your retention needs.

How does schema evolution work across table formats?

All three formats support adding nullable columns and widening types (int → bigint) via metadata-only operations — no file rewrite. Where they differ: Iceberg assigns stable column IDs at creation and supports rename/drop/reorder/type-promotion through metadata alone — column IDs guarantee correct mapping across schema versions. Delta Lake, by default, tracks columns by position/name; renaming requires enabling "column mapping" mode at table creation (not retroactively), otherwise rename is treated as drop + add. Hudi supports add/drop but is stricter about type changes. Best practices: (1) for Delta, enable column mapping from day one if you expect schema changes; (2) for Iceberg, use IDs everywhere and treat schema as code (tests, CI); (3) never rely on column position — always by name or ID; (4) test schema migrations on a table copy before production.

Related Terms

Apache IcebergDelta LakeLakehouse ArchitectureData LakeColumnar Storage

Related Tools

Apache IcebergDelta LakeApache HudiNessieUnity Catalog

Learn More

Related Articles

Browse All Terms Read Articles