/storage_letter.

Parquet and ORC Format Trade-Offs on S3

Parquet wins on S3 unless you're deep in the Hive ecosystem.

· 9 min read
Cover illustration for “Parquet and ORC Format Trade-Offs on S3”
S3 Architecture · October 16, 2026 · 9 min read · 2,106 words

You've heard the standard advice. ORC compresses better. Parquet has broader ecosystem support. Both claims are true enough to feel conclusive and imprecise enough to mislead you in practice. The actual decision on S3 is shaped by at least four variables that interact in ways nobody mentions in the quick answers: ecosystem and query engine, metadata architecture, compression codec, and file-size discipline. Getting the right answer on one variable can steer you wrong on another.

How Parquet and ORC store data differently, and why it matters on object storage

Both formats are columnar, so the baseline case for either is strong against CSV or JSON on S3. But their internal layout diverges in a way that has outsized consequences on high-latency object storage. Parquet splits data into row groups. Within each row group, columns are stored as column chunks. Within each chunk, data is stored as pages. The footer holds the schema and per-chunk statistics such as min, max, and null count. That's centralized metadata. A single footer fetch tells the engine which row groups to skip, and the engine then fetches only the needed column chunks.

ORC takes a different approach. Data is stored in Stripe structures, with a default size of 250 MB. Each Stripe has an index section, a data section, and a stripe footer. The file footer holds aggregate statistics for the whole file. ORC embeds metadata at multiple levels: file, stripe, and column. That's what enables more precise predicate pushdown, including bloom filters and stripe-level indexes.

The S3 consequence is where this gets interesting. ORC's scattered zone maps, stored in row-group footers, require roughly four times the S3 GET requests compared to Parquet's centralized file footer. This was measured on vector index search and top-k workloads. On a local disk, that difference is negligible. On object storage, it dominates query latency. More metadata turns out to be a cost, not a benefit, when every metadata fetch is a network round trip.

Why "ORC compresses better" is the wrong default assumption

The compression claim is real under specific conditions. As a general rule, it's misleading. The comparison that produces the "ORC is smaller" result typically pits Parquet with Snappy against ORC with its default zlib codec. Those formats aren't being compared on equal terms.

When matched on codec, measured results on realistic workloads have found Parquet producing smaller files, and also writing faster. That runs directly against the received guidance. ORC's default zlib codec is slow to write relative to Parquet with zstd, and it still produces a larger file. The default nobody changes is the one that flatters ORC in unfair comparisons.

There's a genuine crossover point at the column-type level. Parquet's dictionary plus RLE encoding works well for integer columns with low distinctness ratios. That means compression comparisons are only valid when anchored to the actual column-type composition of your dataset. And codec choice interacts with query latency as well as storage size. Snappy prioritizes decompression speed for query-heavy workloads. ZSTD or GZIP suit storage-sensitive cases where query speed is secondary. Before you let a compression claim drive the decision, benchmark on your own data.

How each format's metadata architecture plays out in actual Athena query costs

Column pruning and predicate pushdown are where the format decision directly hits your S3 bill, not just performance metrics. Both Parquet and ORC allow Athena to skip columns entirely when a query references only a subset. Switching from a row-based format like CSV to a columnar format can reduce data scanned by a large margin for typical analytical queries.

Parquet's column-pruning advantage is measurably stronger than ORC's in practice. Reading a small subset of columns from a wide table is substantially faster with Parquet than with ORC. That's the difference between a query that scans a few column chunks and one that scans more.

Predicate pushdown is where ORC makes its case. Both formats store min and max statistics per column or stripe. Athena skips row groups or stripes that cannot match a filter condition with these. ORC adds bloom filters and stripe-level indexes on top of min and max, so it can accelerate highly selective filtering. For queries with tight WHERE clauses on indexed columns in Hive-centric pipelines, that's a real advantage.

Parquet has a metadata bloat risk worth naming. On very wide tables with high-cardinality columns, page-level statistics in Parquet can grow so large that downloading and parsing the footer before data is read becomes a material cost. This shows up especially on cold queries against many small files. For most Athena use cases, Parquet is the better choice because of broader ecosystem support and effective predicate pushdown with modern tools. ORC is worth testing for highly filtered queries.

Why the query engine matters as much as the format itself

A format's performance on S3 is not fixed. It's a joint product of the format and the engine reading it. The engine can amplify strengths or mask weaknesses. This is the variable practitioners routinely underweight.

Spark, DuckDB, pandas, Arrow, and most cloud warehouses treat Parquet as the default format for analytics. These engines have deeply optimized Parquet readers, including asynchronous prefetching and external metadata caching. Those optimizations cut the chatty-GET-request problem on S3 before you notice it. ORC often outperforms Parquet within Hive-centric environments, especially for flat data structures and large sequential scans. That's because Hive's reader is tuned to ORC's multi-level index structure.

If you benchmark format performance without holding the engine constant, you get misleading results. And benchmarking without using the engine your production workload will actually run is just as bad. Before you abandon Parquet for ORC because of a benchmark you saw, scrutinize what the engine layer already does for you. The engine can shift the answer more than the format.

Where ecosystem lock-in makes the format decision before you do

For the majority of S3-based workloads, the format choice is effectively made by the ecosystem your team already lives in. If your downstream tools handle a format poorly, optimizing its compression ratios is premature. If you're not already deep in Hive, Parquet is the right default. Spark, DuckDB, pandas, Arrow, and most cloud warehouses use it as the default format for analytics. ORC is optimized for Hive and the Hadoop ecosystem. Within that environment it outperforms Parquet, especially on flat data and sequential scans. So the rule is simple: use ORC if you're deep in Hive, and use Parquet as the default for analytics otherwise. This isn't tribalism. It's the observation that a format's performance is inseparable from the ecosystem that has invested in optimizing its reader.

Nested data is a concrete tiebreaker. Parquet offers excellent support for nested types. ORC's nested data support is good but limited by comparison. For event-heavy or semi-structured workloads, that resolves the question in Parquet's favor even inside Hive-adjacent environments.

How the table format layer (Iceberg vs. Delta Lake) changes the ORC option

Whether ORC is viable in a modern S3 data lake depends heavily on the table format that governs the data. Apache Iceberg, Delta Lake, and Apache Hudi are the three main open table formats in production. Each adds ACID transactions, schema evolution, and time travel on top of files stored in S3.

Delta Lake stores its underlying data in Parquet. It can interact with ORC as an external source via Spark, but ORC does not co-exist natively within a Delta table. That's an architectural constraint, not just a default setting. Apache Iceberg is file-agnostic. It supports Parquet, Avro, and ORC as native file formats within the same table specification. That makes Iceberg the only table format where ORC is a full first-class citizen rather than a workaround.

For teams building cloud-agnostic pipelines across S3, ADLS, and GCS, this distinction matters. Whether ORC can co-exist in the same table, not just be read as an external source, is a real architectural constraint. It surfaces late in the design process if you don't consider it upfront. Iceberg's REST Catalog Specification defines an HTTP API for table management that is language-agnostic and cloud-agnostic. That's a concrete portability advantage independent of the format question.

Why compaction discipline often matters more than format choice

Once ecosystem fit and metadata architecture are accounted for, file compaction is often the largest remaining lever on query performance. This is true regardless of which format you choose. Small file proliferation is a structural problem in streaming ingestion pipelines. Real-time writes produce many small files. S3 must serve those as individual GET requests. That multiplies the latency cost of the format's metadata fetches and negates the column-pruning advantage you thought you were getting.

At re:Invent 2024, Amazon S3 introduced Amazon S3 Tables. It's the first cloud object store with built-in Apache Iceberg support, designed to streamline tabular data management at scale. S3 Tables subsequently expanded its automatic compaction capabilities to include Avro and ORC file formats for Apache Iceberg tables, alongside Parquet. The results are striking: query performance improvements of between 12% and 40% when using compacted tables compared to non-compacted tables, demonstrated through performance testing with over 20 billion events.

The compaction result is format-agnostic. The improvement applied to ORC and Avro tables as well as Parquet. File-size discipline operates on top of format choice, not in competition with it. A team that picks the "right" format but neglects compaction will consistently underperform a team that picks either format and automates compaction. The format debate should always include the maintenance regime question.

Where neither format is enough: the AI training and GPU workload gap

For GPU-based training workloads, Parquet and ORC share a fundamental limitation. Neither was designed for the mini-batch, random-row-access pattern that model training demands. The format choice between them is a secondary concern.

Parquet's read performance on GPU clusters is structurally constrained. Decoding creates CPU bottlenecks during training, especially when features are read in mini-batches or streamed across GPUs. You'll see longer startup times, high CPU utilization for data loading, and I/O bottlenecks on wide rows. Random access is the core problem. To retrieve a single row from a column of variable-width data in Parquet's default configuration, you must read and decompress all preceding data. That's an O(n) operation, so it's too slow for modern AI workloads that depend on fast, random lookups. ORC does not solve this either.

Two format projects have emerged to address this directly. They exist precisely because neither Parquet nor ORC fits the GPU training pattern. For teams building AI training pipelines on S3 today, the Parquet-vs-ORC decision is largely orthogonal to the training bottleneck. The more pressing question is whether the storage layer, format and access path combined can deliver data to GPUs without a CPU-bound decompression step in the middle.

A concrete decision framework for S3 workloads

Diagram: Five-Step Decision Framework: Parquet vs. ORC on S3. Visualizes: Visualize a sequential decision flow of five labeled steps that resolve the Parquet-vs-ORC choice on S3.

The Parquet-vs-ORC decision on S3 resolves to a sequence of questions, not a single headline claim. Ask them in order of impact. Step 1 — Ecosystem: What engine reads this data? If it's Spark, DuckDB, pandas, Arrow, or a cloud warehouse, default to Parquet. If it's Hive or a Hive-centric Hadoop stack, ORC is likely the better fit and often outperforms Parquet in that environment.

Step 2 (Query pattern): How selective are the queries? Wide-column reads with moderate filtering favor Parquet's column-pruning advantage. Highly selective filtering on indexed columns favors ORC's bloom filters and stripe-level indexes, worth benchmarking. Random single-row lookups or mini-batch GPU reads? Neither format is well-suited. Consider the access layer before the format.

Step 3 (Table format): Does the architecture require ORC as a native format? If Delta Lake governs the table, ORC is not a native option. That resolves the question to Parquet by constraint. If Apache Iceberg governs the table, ORC, Parquet, and Avro are all natively supported. Format choice remains open.

Step 4 — Compression codec: Are you comparing formats on equal terms? Match codecs before benchmarking. Snappy for query-heavy workloads. ZSTD or GZIP for storage-sensitive cases. Measure compression on your own column-type composition. The crossover point between formats is dataset-specific.

Step 5 (Compaction): Is file-size discipline in place? Automate compaction regardless of format. The performance benefit applies to both Parquet and ORC and is often larger than the difference between formats.

For teams running AI or agent workloads on top of an S3 data lake, a cloud filesystem layer that mounts the bucket as a POSIX filesystem addresses the metadata-chattiness problem at the access layer. Training jobs and agents read files with standard file I/O, so they don't issue raw S3 GET requests. That decouples format choice from access-pattern performance. The format decision matters, but it's one variable in a system. Get the system right, and the format question gets less interesting.

Sources

  1. Compaction support for Avro and ORC file formats in Apache Iceberg tables in Amazon S3
  2. How to choose between Parquet, ORC and AVRO for S3, Redshift and Snowflake? - BryteFlow
  3. Data Formats in Analytical DBMSs: Performance Trade-offs and Future Directions
Filed underS3 Architecture

More in S3 Architecture