Glossary Entry

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.

Written by Alex Merced

A columnar format is a way of laying out tabular data so that all values of one column are stored next to each other, instead of storing each row’s fields together. A query that reads three columns from a table with a hundred columns only has to touch those three columns, and because similar values sit side by side, they compress and encode far better than mixed row data. Apache Parquet and Apache ORC are the common columnar file formats on disk, and Apache Arrow is the common columnar format in memory.

How It Works

Take a table with order_id, customer, region, and amount. A row format such as CSV or Avro writes one complete record after another. A columnar format writes every order_id, then every customer, and so on.

Parquet organizes a file into row groups (horizontal slices of the table). Inside each row group, each column is stored as a column chunk, which is split into pages. The file footer holds the schema and statistics such as min and max values per column chunk. Readers use that layout in three ways:

  • Projection. Only the column chunks a query needs are read from storage.
  • Encoding and compression. Runs of repeated or low-cardinality values suit dictionary encoding and run-length encoding, followed by a general codec such as Snappy or Zstandard. The Parquet project describes itself as a column-oriented format with “high performance compression and encoding schemes.”
  • Skipping. Min and max statistics let a reader skip row groups and pages whose value ranges cannot match a filter.

Apache Arrow applies the same idea in memory. Its specification is a language-independent columnar layout, and the contiguous buffers let engines run vectorized execution that processes batches of values with SIMD instructions instead of one row at a time.

Row vs Columnar

AspectRow format (CSV, JSON, Avro)Columnar format (Parquet, ORC)
Physical layoutFull records stored togetherEach column stored together
Good atWriting and reading whole records, streaming eventsScans, aggregations, filters over a few columns
CompressionLower, because adjacent values differ in typeHigher, because adjacent values share a type
Reading one columnMust read every rowReads only that column’s chunks
Typical homeOLTP systems, message payloadsAnalytics, data lakes, lakehouses

Columnar formats are slower for single-row lookups and frequent small updates, which is why transactional databases keep a row layout.

Columnar Formats in the Lakehouse

Apache Iceberg, Delta Lake, and Apache Hudi are table formats, not file formats. They track collections of data files, and in practice those data files are usually Parquet. Iceberg adds its own column-level statistics to manifest files, so an engine can prune whole files before opening them and then use Parquet’s footer statistics to prune row groups inside the files it does read.

Engines such as Dremio, Trino, Spark, and DuckDB all read Parquet directly. Dremio and DuckDB also process data in a columnar in-memory form (Dremio is built on Arrow), which keeps data in a column layout from storage to result. Arrow Flight and ADBC extend this to the network, moving result sets as Arrow batches instead of converting them row by row.

For the hands-on details, the Hub’s guide to row vs column storage walks through the query engine side, and the Apache Parquet and Apache Arrow entries cover each format in depth.

Summary

A columnar format stores data by column so analytical queries read less, compress better, and skip more. Parquet on disk and Arrow in memory are the two formats most lakehouse engines share, and open table formats like Iceberg sit on top of them to add transactions and table-level metadata.

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

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.

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 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.

What is Apache Arrow?

Apache Arrow is an open, language-independent columnar in-memory format for analytics, covering zero-copy reads, SIMD efficiency, and Arrow Flight transport.

What is Vectorized Execution?

Vectorized execution is a query processing model that works on batches of columnar values instead of rows, using CPU cache and SIMD in engines like DuckDB.

Apache Avro in the Lakehouse: Iceberg Manifests, Kafka, and Parquet

Apache Avro is a row-oriented binary serialization format with schemas. In a lakehouse it carries Kafka events and stores Apache Iceberg manifest files.

What is Apache Kudu?

Apache Kudu is an open-source columnar storage engine for fast inserts, updates, and analytic scans using primary key indexes and Raft, and how Iceberg differs.

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.

Work with Alex