The format that should be your default
Apache Parquet is a columnar binary file format originally from Hadoop, now ubiquitous across the analytics world. The file stores each column's data in a separate, compressed chunk, with rich statistics (min/max/null-count) and a footer that lets readers skip whole row groups based on filter predicates. The result: queries that read a few columns from a 100GB file touch only the bytes they need, and pay compression-aware cost.
What you get for free vs CSV
- Types. Schema is part of the file.
amount_usdisdouble,order_dateistimestamp[us]— no guessing on read. - Compression. Snappy is the default;
zstdtypically gives 2–3× better ratios at similar speed. A 10GB CSV often becomes a 1–2GB Parquet. - Column pruning. Reading only
order_dateandamount_usdfrom a 50-column file skips the other 48. - Predicate pushdown.
WHERE country = 'KR'can use row-group statistics to skip whole row groups whosecountrycolumn never contained'KR'. - Splittable. Multiple readers can process different row groups in parallel.
Partitioning — the next level
Parquet writers can split a logical "table" into a directory tree like orders/year=2026/month=04/data.parquet. Readers can prune entire partitions before opening any files. Combined with column pruning and predicate pushdown, this is how you get sub-second queries over hundreds of GB of data on a single machine with DuckDB.