← All cheatsheets
Data Engineer · #056 · September 25, 2026 · 2 min read

Parquet vs CSV vs JSON: why your 2 GB CSV is a 200 MB Parquet

How the three formats store the same rows, why columnar files are 10x smaller and faster to scan, the type traps of the CSV round-trip, and when each format is the right call.

Get the free PDF

One page, print-ready, free to share. No signup needed.

Download the PDF

Your 2 GB CSV is a 200 MB Parquet. Same rows, same columns: the difference is the format tax, and your storage bill and query times both pay it. One page on picking file formats on purpose. The print-ready A4 PDF is at the bottom.

The three

  • CSV: rows of text, no types, parse every byte.
  • JSON: nested documents, keys repeated on every row.
  • Parquet: columnar, typed, compressed. Built for analytics.

Size

df = pd.read_csv("sales_2026.csv")   # 2.1 GB

df.to_parquet("sales_2026.parquet")  # 205 MB

# and reads pick their columns
pd.read_parquet("sales_2026.parquet", columns=["date", "amount"])

Per-column compression is the whole trick: similar values sit together, so dictionary and run-length encoding crush them. JSON is the biggest of the three because the keys ride along on every single row.

Speed

  • Columnar reads: load the 3 columns you asked for, skip the other 47.
  • Predicate pushdown: row-group statistics let filters skip whole chunks unread.
  • CSV scan: parse everything, always, to answer anything.

Types

Column inAfter a CSV round-tripIn Parquet
zip "00123"123, an int now"00123", string
2026-09-25a string, parse againdate32, stays a date
NULL vs ""both become emptynull survives

When each wins

  • CSV: humans, Excel, one-off exchange with systems you do not control.
  • JSON: APIs, events, genuinely nested data.
  • Parquet: lakes, warehouses, anything a query engine scans.

Gotchas

  • CSV delimiter roulette: commas inside quotes, encodings, BOMs.
  • Parquet is not appendable row by row: write new files, partition by date.
  • Parquet is not human-readable: keep a small CSV sample next to it for eyeballing.

Interview phrasing worth memorizing: CSV is a serialization of strings, not of data. Exchange in CSV, run analytics on Parquet.

Frequently asked questions

Why is a Parquet file so much smaller than the same data as CSV?
Parquet stores data by column, so similar values sit next to each other and compress extremely well: a column of dates or repeated categories encodes to a fraction of its text size (dictionary and run-length encoding, then compression like snappy or zstd on top). A 2 GB CSV routinely lands around 10x smaller as Parquet. JSON is the largest of the three because every row re-prints every key.
Why are analytics queries faster on Parquet than on CSV?
Two reasons. Columnar reads: a query that needs 2 of 50 columns reads only those column chunks, while CSV must parse every byte of every row. Predicate pushdown: Parquet stores min/max statistics per row group, so a filter like date = yesterday skips whole chunks of the file without reading them.
When should you still use CSV or JSON?
CSV when a human, Excel, or an unknown external system needs to open the file: it is the universal exchange format. JSON when the data is genuinely nested or event-shaped, which is why APIs speak it. Parquet for anything analytical: lakes, warehouses, intermediate pipeline storage, and any file a query engine will scan more than once.
What does a CSV round-trip do to your data types?
CSV stores strings, so every consumer re-guesses the schema. Zip code 00123 becomes the integer 123, dates come back as strings to parse again, and NULL versus empty-string is lost. Parquet stores the schema in the file: types survive the round-trip.

Get the free PDF

One page, print-ready, free to share. No signup needed.

Download the PDF

More cheatsheets