Appendix C The Apache Iceberg specification
Apache Iceberg is presented as a formal, versioned table format specification that defines how tables store metadata, track snapshots, evolve schemas and partitions, handle deletes, and coordinate concurrent writes. Its purpose is to make table behavior explicit and predictable across engines such as Spark, Flink, Trino, and Dremio, avoiding the ambiguity and fragility of directory-based table layouts. By treating the specification as a shared contract, Iceberg enables reliable interoperability, snapshot isolation, backward-compatible evolution, and safer multi-engine lakehouse deployments.
The appendix explains how Iceberg’s table format has evolved through versions. Version 1 established the metadata-driven foundation with immutable file tracking, manifests, snapshots, schema evolution, and partition independence. Version 2 added row-level delete support through position and equality delete files, along with stricter validation rules for safer multi-writer operation. Version 3 expanded Iceberg with richer data types, default column values, multi-column transforms, row lineage, deletion vectors, and encryption metadata. A future Version 4 is described as a performance- and operations-focused direction, with proposals such as single-file commits, Parquet-based metadata, improved statistics, and relative paths for more portable tables.
The text also covers Iceberg’s metadata architecture, catalog APIs, auxiliary metadata, and migration model. Tables are managed as immutable metadata files and snapshots, with manifest lists and manifests enabling efficient planning, time travel, rollback, and atomic commits through optimistic concurrency and sequence numbers. The REST Catalog specification standardizes how engines interact with catalogs over HTTP for namespaces, tables, transactions, security, metrics, and scan planning, reducing vendor-specific integration work. Puffin files provide optional, extensible storage for rich metadata such as column metrics, bloom filters, and custom indexes. Finally, Iceberg emphasizes controlled compatibility: newer engines can generally read older tables, upgrades are explicit and forward-only, existing data is not rewritten, and organizations can adopt newer format features at their own pace.
FAQ
What is the Apache Iceberg specification?
The Apache Iceberg specification is a versioned, living standard that defines how Iceberg tables behave. It describes how table metadata is structured, how snapshots are created and updated, how manifests track files, how deletes are represented, how schemas and partitions evolve, and how concurrency and commits are managed. Its purpose is to ensure that different engines, such as Spark, Flink, Trino, and Dremio, can reliably read and write the same Iceberg tables.
Why does Iceberg formalize table behavior instead of relying on implementation details?
Iceberg formalizes table behavior to avoid ambiguity, inconsistent engine behavior, data corruption, and vendor lock-in. By defining a shared contract, Iceberg provides predictable reads and writes, isolation between readers and writers, backward-compatible schema and partition evolution, and consistent snapshot tracking. This makes Iceberg suitable for multi-engine, cloud-native, and multi-tenant lakehouse environments.
What are the main differences between Iceberg format versions 1, 2, and 3?
Version 1 introduced the core Iceberg model: immutable file tracking, snapshots, manifest files, schema evolution, and partition independence. Version 2 added row-level deletes through position deletes and equality deletes, along with stricter writer validation rules. Version 3 expanded the format with extended data types, default column values, multi-argument transforms, row lineage tracking, deletion vectors, and table encryption metadata.
What capabilities did Iceberg version 1 introduce?
Iceberg version 1 introduced the foundation for metadata-driven analytical tables. Instead of relying on directory layouts or file naming conventions, v1 tracks data files explicitly through manifests. It supports snapshot-based access, safe schema evolution, partition values stored in metadata, and data files in Parquet, Avro, and ORC formats. These features enabled consistent reads, efficient query planning, and safer table evolution.
How do row-level deletes work in Iceberg version 2?
Iceberg version 2 supports row-level deletes without requiring full data file rewrites. It does this through delete files. Position deletes identify rows by file path and row position, while equality deletes identify rows by matching column values, such as user_id = 42. During query planning and execution, engines apply these delete files so that deleted rows are excluded from results.
What are deletion vectors in Iceberg version 3?
Deletion vectors are a version 3 feature that efficiently tracks rows that have been logically deleted. Instead of relying only on separate delete files during reads, deletion vectors use compact binary structures to mark deleted rows. This can improve read performance and supports more advanced data management use cases, especially where row-level changes are frequent.
How do Iceberg snapshots and metadata files support ACID behavior?
Each Iceberg table has immutable metadata files that describe the full table state, including schema, partition spec, properties, and the current snapshot. When a change is committed, Iceberg writes a new metadata file and updates the catalog pointer atomically. Readers either see the old table state or the new one, never a partial update. Snapshots provide complete, immutable views of the table at points in time, enabling time travel, rollback, auditing, and snapshot isolation.
What are manifest lists and manifest files in Iceberg?
A snapshot points to one or more manifest lists. A manifest list acts as an index of manifest files and records metadata such as manifest location, partition range, snapshot ID, and sequence number. Each manifest file lists a subset of the table’s data files, along with partition statistics and file-level metrics. This layered metadata structure helps engines prune unnecessary files and plan scans efficiently, even for tables with millions of files.
What is the REST Catalog specification?
The REST Catalog specification defines a standard HTTP-based API for interacting with Iceberg catalogs. It allows engines to manage namespaces, create and load tables, update metadata, commit transactions, gather metrics, and configure catalog behavior through consistent JSON-based endpoints. Its goal is to let any Iceberg client communicate with any compliant REST Catalog server without custom connectors or vendor-specific logic.
What is the Puffin file format used for in Iceberg?
Puffin is a compact, binary, versioned file format for storing auxiliary Iceberg metadata outside the core table metadata structures. It is commonly used for column-level metrics, bloom filters, custom indexes, histograms, quantiles, or cardinality estimates. Puffin files are optional, so tables work normally without them, but when present they can improve scan planning, observability, and advanced analytics without bloating manifests or snapshot metadata.
Architecting an Apache Iceberg Lakehouse ebook for free