File formats
How rows and columns are laid out inside a data file, which decides how much a query has to read.
17 technologies on this page ↓How it works
Row formats such as CSV, JSON lines and Avro write one whole record after another. That’s ideal for appending events, but a query has to read every field of every row. Columnar formats such as Apache Parquet and ORC split rows into row groups (ORC calls them stripes) and store each column separately inside them, compressed with encodings that suit the values. A footer holds the schema plus min/max statistics for every column chunk, so an engine reads only the columns a query names and skips row groups that can’t match.
A filing cabinet with one drawer per field. To total every invoice amount you open the “amount” drawer, instead of pulling out every folder and reading each page.
Reach for it when
- Parquet for anything a warehouse, Spark, Trino or DuckDB will scan
- Avro or JSON lines for event streams and logs written one record at a time
- CSV only for small hand-offs to spreadsheets and partners
Think twice when
- Single-row lookups or frequent in-place updates; that’s a database
- Thousands of tiny Parquet files: per-file overhead dominates, so compact them into files of a few hundred MB (Iceberg’s default target is 512 MB)
A real example
Sensors write readings with 40 fields each. As gzipped CSV, a month is 1.2 TB, and “average temperature per day” reads all of it. Rewritten as Parquet with ZSTD compression it shrinks to about 150 GB, and the same query reads only the ts and temp_c columns: around 8 GB.
Kinds of file formats
Specific products, and what each does differently.
Columnar files →
Files on disk that store each column on its own, compressed, so a query reads only the columns it names and skips blocks that can’t match.
Apache ORCOpen sourceA columnar file format born in Hive: typed columns in large stripes, built-in indexes every 10,000 rows, and the storage behind Hive’s ACID tables.
PuffinOpen sourceApache Iceberg’s file format for the data that doesn’t fit in a manifest: a container of typed binary blobs, such as distinct-value sketches and deletion vectors, described by a JSON footer.
VortexOpen sourceA columnar file format and toolkit that keeps data compressed with modern encodings, reads single rows fast and runs filters directly on the compressed data, pitched as a faster successor to Parquet.
LanceOpen sourceA file and table format for AI data: columnar like Parquet, but fast at fetching single rows, with vector and full-text indexes, versions and room for images and video.Mainly Table formatsIn-memory columnar →
A shared layout for tables in RAM, so libraries and engines in different languages can hand each other data without copying or converting it.
Array formats →
Storage for dense and sparse multi-dimensional arrays, such as images, climate grids, genomic variants and LiDAR points, read by slicing coordinates.
Binary serialization →
Compact, schema-driven encodings for one record or message at a time: the bytes between services and inside event streams.
Cap’n ProtoOpen sourceA binary format laid out like an in-memory struct, so reading needs no parse step, plus an RPC system built on object references and promise pipelining.Mainly Remote procedure calls
Protocol BuffersOpen sourceGoogle’s schema-first binary encoding: messages defined in `.proto` files, fields identified by number, code generated for each language.Mainly Remote procedure callsText and markup →
Human-readable formats for APIs, configuration files and documents: JSON, XML, YAML and TOML.
Format descriptions →
Languages that describe a binary format someone else designed, field by field, and generate a parser for it.
Apache ORC | Columnar files | Open source | Apache Software Foundation | Apache 2.0 | 2026-10-06 |
| Columnar files | Open source | Apache Software Foundation | Apache 2.0 | 2026-10-05 | |
| Apache TsFile | Columnar files | Open source | Apache Software Foundation | Apache 2.0 | 2026-10-09 |
Puffin | Columnar files | Open source | Apache Software Foundation | Apache 2.0 | 2026-10-11 |
Vortex | Columnar files | Open source | LF AI & Data (Linux Foundation), started at SpiralDB | Apache 2.0 | 2026-10-06 |
Lance | Columnar files | Open source | Lance community, started by LanceDB | Apache 2.0 | 2026-10-05 |
| In-memory columnar | Open source | Apache Software Foundation | Apache 2.0 | 2026-10-05 | |
TileDB | Array formats | Open source | TileDB, Inc. (trading as Tile.ai since September 2026) | MIT for the engine (TileDB Embedded), its language APIs and the published format specification; the company’s hosted platform and its new Tile.ai product are commercial | 2026-10-06 |
| Binary serialization | Open source | Apache Software Foundation | Apache 2.0 | 2026-10-05 | |
| CBOR | Binary serialization | Open source | IETF (open standard, RFC 8949) | Open standard, free to use | 2026-10-09 |
Cap’n Proto | Binary serialization | Open source | Cloudflare, Inc. | MIT | 2026-10-06 |
Protocol Buffers | Binary serialization | Open source | Google LLC | BSD 3-Clause (Apache 2.0 until version 2.0.2 in September 2008) | 2026-10-06 |
| Text and markup | Open source | IETF and Ecma International (open standard) | Open standard, free to use; ECMA-404 is also ISO/IEC 21778 | 2026-10-06 | |
| Text and markup | Open source | toml-lang project, started by Tom Preston-Werner (open specification) | MIT (the specification repository) | 2026-10-06 | |
| Text and markup | Open source | W3C (open standard) | Open standard, free to implement (W3C Recommendation) | 2026-10-06 | |
| Text and markup | Open source | YAML Language Development Team (open specification at yaml.org) | Open specification, free to implement; the spec may be freely copied unmodified | 2026-10-06 | |
Kaitai Struct | Format descriptions | Open source | Kaitai Project (community, funded in part by the NLnet Foundation) | GPLv3+ (compiler, Web IDE and console visualizer); runtime libraries MIT, except JavaScript (Apache 2.0); each spec in the format gallery carries its own licence | 2026-10-06 |
What each provider calls it
- AWS
- Open formats: Athena, Redshift Spectrum and Glue read Parquet, ORC, Avro, CSV and JSON
- Google Cloud
- BigQuery loads and external tables over Parquet, ORC, Avro, CSV and JSON
- Azure
- Fabric (over OneLake) and Synapse serverless SQL query Parquet, CSV and JSON files
- Open source & others
- Apache Parquet, Apache ORC, Lance (fast row lookups for AI data), Vortex (compressed encodings you can filter without decompressing; LF AI & Data), TileDB (dense and sparse multi-dimensional arrays, MIT), Apache Avro, Apache Arrow (in memory), CSV, JSON and JSON Lines; for messages: Protocol Buffers, Cap’n Proto; for configuration: YAML, TOML and XML; for describing existing binary formats: Kaitai Struct
In code · python
import pyarrow.csv as csv
import pyarrow.parquet as pq
table = csv.read_csv("readings.csv")
pq.write_table(table, "readings.parquet", compression="zstd")
# read two columns; the other 38 are never touched
temps = pq.read_table("readings.parquet", columns=["ts", "temp_c"])
print(temps.num_rows, temps.nbytes)Often confused with
Where it came from2005–2025
For decades, data moved between systems as text. CSV was used to swap data between spreadsheet programs for so long that when RFC 4180 finally wrote it down in 2005, it noted the format had “never been formally documented”. Row files like CSV, and later JSON lines, are easy to write, but a query that needs one column still has to read every byte of every row.
Databases had already found the alternative. In 2005 Michael Stonebraker and colleagues at MIT, Brown, Brandeis and UMass Boston published C-Store, a database that stores data by column to make reads fast, and Google’s 2010 Dremel paper showed how to lay out nested records in columns and aggregate trillion-row tables in seconds. Hadoop users wanted the same for files. Doug Cutting’s Avro (2009) gave Hadoop compact row files with a schema, and in early 2013, a month apart, Hortonworks and Facebook announced ORC to speed up Hive, and Twitter and Cloudera announced Parquet.
Parquet won the broadest support and became the default data file under table formats such as Iceberg and Delta Lake. Apache Arrow (2016) applied the same columnar layout in memory, so engines and languages can hand data to each other without converting it. Newer formats such as Lance revisit the trade-offs for AI data, where fetching single rows matters as much as scanning.
Why it’s built this way
- Store each column together, not each row
- Analytical queries read a few columns of many rows. Keeping a column’s values together means a query reads only what it needs, and similar values next to each other compress far better.
- Put the schema inside the file
- CSV carries no types, so every reader has to guess or be told. Avro and Parquet embed their schema, so any tool can open a file without outside definitions.
- Shred nested records into flat columns
- Real data has lists and structs. Dremel’s repetition and definition levels let nested records be stored as plain columns and rebuilt on read, and Parquet adopted the technique.
Timeline
- 2005
C-Store paper makes the case for column stores; RFC 4180 documents CSV
- 2009
Avro brings schema-described binary row files to Hadoop
- 2010
Google’s Dremel paper shows columnar storage for nested data
- 2013
ORC (February) and Parquet (March) announced for Hadoop
- 2016
Apache Arrow standardises columnar data in memory
- 2025
Parquet adds
variantand geospatial types; a Lance paper tackles random access
- RFC 4180: Common Format and MIME Type for CSV Files (October 2005)
- C-Store: A Column-oriented DBMS (VLDB 2005)
- Dremel: Interactive Analysis of Web-Scale Datasets (VLDB 2010)
- Doug Cutting: [PROPOSAL] new subproject: Avro (hadoop-general, April 2009)
- Hortonworks blog: The Stinger Initiative, ORCFile built with Facebook (20 February 2013) · archived copy, original
- Introducing Parquet: Twitter and Cloudera announcement (hdfs-user list, 12 March 2013)
- ASF board minutes: Establish the Apache Arrow Project (January 2016)
- Apache Arrow: Overview (a standard in-memory columnar format)
- parquet-format 2.11.0 release notes: Variant, GEOMETRY and GEOGRAPHY types (March 2025)
- Lance: Efficient Random Access in Columnar Storage (arXiv, April 2025)
Sources26
- Apache Parquet docs: File format (row groups, column chunks, footer)
- Apache Parquet docs: Page index and column chunk statistics
- Apache ORC specification v1 (stripes, footer, column statistics)
- Apache Avro specification (row-oriented container files)
- JSON Lines format
- Iceberg docs: Configuration (write.target-file-size-bytes defaults to 512 MB)
- Athena docs: Supported SerDes and data formats
- Redshift docs: Data files for queries in Redshift Spectrum
- AWS Glue docs: Data format options for ETL
- BigQuery docs: Batch loading data (Avro, Parquet, ORC, CSV, JSON)
- BigQuery docs: Cloud Storage external tables
- Microsoft Fabric docs: Browse Parquet, CSV and JSONL files with OPENROWSET
- Azure Synapse docs: Query storage files with serverless SQL (Parquet, CSV)
- Azure Synapse docs: Query JSON files with serverless SQL
- Lance homepage: fast random access for AI data
- PyArrow docs: Reading CSV files
- PyArrow docs: Reading and writing Parquet files
- Protocol Buffers docs: Encoding
- Cap’n Proto: Introduction
- RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format
- JSON Lines
- YAML Ain’t Markup Language, revision 1.2.2
- TOML v1.1.0 specification
- W3C: Extensible Markup Language (XML) 1.0, Fifth Edition
- vortex-data/vortex on GitHub
- TileDB-Inc/TileDB on GitHub (MIT)

