Glossary Entry

Apache Parquet: How the File Format Works Under Iceberg Tables

Apache Parquet is an open source columnar file format for analytics. See how its row groups, encodings, and statistics work and how it relates to Iceberg.

Written by Alex Merced

Apache Parquet is an open source columnar file format built for analytical queries. It was started in 2013 by engineers at Twitter and Cloudera and became a top-level Apache Software Foundation project in 2015. Today it is the default data file format for Apache Iceberg tables and the only data file format for Delta Lake.

Row-based formats such as CSV and JSON are easy to write one record at a time but slow for analytics. To average one revenue column in a 100-column CSV file, an engine has to read every column of every row. Parquet changes the physical layout so the engine can read only what the query needs.

Columnar Layout

Parquet stores values of the same column together. When a query asks for SUM(purchase_amount), the engine reads only the purchase_amount column chunks and skips the rest. This is called column projection, and it cuts both I/O and object storage request costs.

A Parquet file is organized in three levels:

  • Row groups: horizontal slices of the file, often sized around 128 MB or larger.
  • Column chunks: the data for one column inside one row group.
  • Pages: the smallest unit of encoding and compression inside a column chunk.

The file footer holds the schema and metadata for every row group and column chunk.

Encoding and Compression

Because each column holds values of one type, Parquet can encode them efficiently before compression.

  • Dictionary encoding: repeated values such as country names are stored once in a dictionary and replaced by small integer codes.
  • RLE and bit-packing hybrid: runs of repeated values and small integers are packed tightly. Sorting data before writing makes runs longer and files smaller.
  • Delta and byte-stream-split encodings: help with sorted integers, timestamps, and floating point data.

A codec such as Snappy, ZSTD, GZIP, or LZ4 is applied on top. ZSTD is a common choice for lakehouse tables when you want smaller files at modest CPU cost.

Statistics and Predicate Pushdown

The footer stores minimum and maximum values, and null counts, for each column chunk. Optional page indexes add the same statistics per page, and optional Bloom filters help with equality lookups on high-cardinality columns. When a query filters on event_date = '2026-05-14', the engine checks these statistics and skips row groups or pages that cannot contain a match. Engines such as Trino, Spark, DuckDB, and Dremio all use this to avoid reading data.

Parquet vs Iceberg: File Format vs Table Format

Parquet and Iceberg are often mentioned together but solve different problems.

Apache ParquetApache Iceberg
What it isA file formatA table format: metadata that defines a table as a set of files
Unit it describesOne fileA whole table across many files and snapshots
StatisticsPer row group and page, inside each filePer file in manifests, so engines can skip whole files before opening them
TransactionsNone; a file is written onceACID commits through a catalog
Schema evolutionLimited to a single file’s schemaAdd, drop, rename, and reorder columns by field ID
Partitioning, time travelNoHidden partitioning, snapshots, time travel

In practice, an Iceberg table is a catalog pointer to metadata, which lists manifests, which list Parquet data files. Iceberg prunes at the file level and Parquet prunes inside each file. Iceberg also supports ORC and Avro data files, but Parquet is the default and the most widely supported choice across engines. Delta Lake and Apache Hudi also store their data in Parquet.

To go deeper, see What is Apache Parquet? Columns, Encoding, and Performance, Parquet Page Indexes and the Last Mile of Pruning in Apache Iceberg, and The State of Apache Parquet in 2026.

Summary

Apache Parquet stores data by column, encodes and compresses each column efficiently, and keeps statistics that let engines skip data. Table formats like Iceberg build on it by adding transactions, snapshots, and table-level metadata, which is why Parquet sits at the bottom of nearly every open lakehouse.

Learn More

To learn more about the Data Lakehouse, read The Lakehouse Built for Everyone by Alex Merced. You can find this and other books by Alex Merced at books.alexmerced.com.

Related Terms

Dictionary Encoding: How Parquet, Arrow, and Iceberg Tables Compress Repeated Values

Dictionary encoding stores each distinct value once and replaces repeats with small integer IDs. See how Parquet, Arrow, and Iceberg writers use it and tune it.

Apache ORC vs Parquet: Which to Use for Iceberg Tables

Apache ORC is an open source columnar file format created in 2013 to speed up Apache Hive. See how it differs from Parquet and when to use it in Iceberg.

What is Predicate Pushdown?

Predicate pushdown is a query optimization that applies filters at storage so engines read less data. See how Parquet stats and Iceberg manifests make it work.

What is Columnar Format?

A columnar format stores each column's values together instead of row by row, which speeds up analytical scans. See how it relates to Arrow and Iceberg.

Bloom Filters in Parquet and Apache Iceberg Tables

A Bloom filter is a compact probabilistic structure that tells an engine a value is definitely absent. Learn how Parquet and Iceberg use them to skip data.

What is Run-Length Encoding?

Run-length encoding is a lossless compression method that stores a run of repeated values as one value and a count, which suits sorted columnar data.

CSV Files in a Lakehouse: Why and How to Convert Them to Iceberg

A CSV file is plain text where each line is a row and commas separate columns. Learn its limits for analytics and how to load CSV into Iceberg tables.

What is JSON?

JSON is a human-readable text format for nested key-value data used by most web APIs. Learn why it is slow for analytics and how lakehouses turn it to Parquet.

Lance File Format: How It Compares to Parquet and Apache Iceberg for AI Data

Lance is an open columnar format for AI data with fast random access and built-in vector indexes. See how it compares to Parquet and where it fits with Iceberg.

Work with Alex