CSV vs Parquet

CSV vs Parquet: size, speed and when to switch

In DuckDB's TPC-H test, a 15.95 GB CSV became a 3.78 GB Parquet file and query 1 fell from 6.72 s to 0.88 s, but CSV stays readable in any text editor and opens in desktop Excel. rows.page opens both formats and converts between them in your browser, free with no signup.

.csv.parquet
Drop a file here
Stays in your browserUp to 1.5 GB

No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).

Should you use CSV or Parquet?

CSV

CSV is plain text with one record per line and fields separated by a delimiter, usually a comma. Use it when a person will open the file in Excel or a text editor, when a script appends rows one line at a time, or when the receiving tool only accepts text.

Parquet

Parquet is a binary, column-oriented format that stores the values of each column together, compressed, with a typed schema. Use it to store, query or move large tables when you want smaller files, faster analytical queries and column types that survive between tools.

CSV vs Parquet compared: size, speed and types

DuckDB benchmarked both formats in December 2024 on the TPC-H scale factor 20 lineitem table, running each query directly on the file. Parquet is smaller because the values of one column compress well together. It is faster because a query reads only the columns it needs and skips row groups whose min/max statistics rule them out.

CSV vs Parquet comparison
PropertyCSVParquet
Storage layoutRow by row, plain textColumn by column, binary, compressed
TPC-H SF20 lineitem size15.95 GB3.78 GB (Snappy), 3.22 GB (zstd)
TPC-H query 1 (DuckDB, Dec 2024)6.72 s0.88 s (Snappy)
TPC-H query 21 (DuckDB, Dec 2024)19.95 s2.08 s (Snappy)
Schema and typesNone stored; readers guess types from textTyped schema stored in the file
Human readabilityAny text editorBinary; needs a Parquet reader
Desktop ExcelOpens directlyNo built-in connector
Appending rowsAdd a line at the endWritten in row groups; no line-by-line append
rows.page browser limit1.5 GB per tab; bigger files load partiallyNot held to the 1.5 GB check

Why does CSV lose column types?

CSV stores only text, so every program that opens it guesses each column's type. That is why tools disagree on whether a column of digits is a number or a string, and whether 03/04/2024 is in March or April.

Parquet writes a typed schema into the file, so numbers, dates, booleans and strings keep their types in every tool that reads it. Text files also carry an encoding question: rows.page reads CSV as UTF-8, as UTF-16 when it has a BOM, and otherwise as Latin-1 with the note "Read as Latin-1 text.", but a byte from 0x80 to 0x9F, such as a Windows-1252 euro sign, stops the file from opening until you re-save it as UTF-8.

Can you open a Parquet file in Excel or a text editor?

No. Parquet is binary, so a text editor shows unreadable bytes, and desktop Excel has no Parquet connector; Power Query's Parquet connector exists only in Power BI and Power Query Online. A CSV opens in both, and you can grep it or paste a few lines into an email.

If you only have a browser, drop the .parquet or .pq file on rows.page to sort, filter, check per-column stats and run SQL. DuckDB-WASM reads it on your machine, and nothing is uploaded unless you press Share.

When is CSV still the better choice?

  • A script or logger appends records one line at a time as events happen.
  • Teammates need to open the file in desktop Excel.
  • You want to read or diff a small file in a text editor.
  • A downstream tool only accepts text, such as comma-delimited UTF-8.

Parquet is written in row groups with its metadata at the end of the file, so you can't add a single line the way you can with CSV.

How do you convert CSV to Parquet or Parquet to CSV?

  1. Open rows.page and drop a .csv, .txt, .parquet or .pq file on the page, or click Paste data to paste cells copied from Excel or Google Sheets.
  2. Optionally narrow it down with a filter such as country:NL or price:>20, or a SQL query against the table data.
  3. Open Export and pick Parquet for a zstd-compressed .parquet file, or CSV for a comma-delimited UTF-8 file with a header row and no BOM.

Export writes the current view: filter, sort, hidden columns or SQL result. To drop duplicate rows first, exclude the hidden __rid row-number column:

sql
SELECT DISTINCT * EXCLUDE (__rid) FROM data
  • SQL-result exports stop at 1,000,000 rows; filtered views export every matching row.
  • CSV export has no delimiter, encoding or BOM option.
  • Cells that start with =, +, -, @, a tab or a carriage return get a leading apostrophe, so spreadsheets don't run them as formulas.
  • rows.page does not read or write .xlsx or .xls, so save Excel files as CSV first.

rows.page limits and prices

WhatLimit or price
Open a file in your browserFiles up to 1.5 GB, $0, no account, nothing uploaded
Share a link without an account$0, files up to 100 MB, link deleted 7 days after creation
Free account$0, 10 datasets kept, last 3 versions
Pro$12/month, 100 datasets, files up to 500 MB, private links
Max$39/month, 1,000 datasets, files up to 2 GB, private links

Questions

How much smaller is Parquet than CSV?

In DuckDB's December 2024 benchmark, the TPC-H scale factor 20 lineitem table took 15.95 GB as CSV, 3.78 GB as Snappy Parquet and 3.22 GB as zstd Parquet. The zstd file is about one-fifth the size of the CSV.

How much faster are queries on Parquet than on CSV?

In the same benchmark, TPC-H query 1 ran in 0.88 s on Snappy Parquet versus 6.72 s on CSV, and query 21 in 2.08 s versus 19.95 s. That is about 7.6 and 9.6 times faster.

Does rows.page upload my file when I open it?

No. Opening a CSV or Parquet file reads it inside your browser with DuckDB-WASM; it is uploaded only when you press Share or push it with curl -T data.csv https://rows.page.

Can I open a remote CSV or Parquet URL without downloading it?

Yes, put the public URL after rows.page/, for example https://rows.page/https://example.com/data.parquet; it works with raw.githubusercontent.com, Hugging Face /resolve/ links and S3 presigned URLs. If the host blocks cross-origin requests, rows.page fetches the file through its proxy (up to 100 MB, 30 seconds, 5 redirects) and stores nothing.

How big a file can I share after converting it?

Without an account a push can be 100 MB, with 50 pushes and 1 GB per IP address per UTC day, and the link expires after 7 days. Signed in, Free ($0) allows 100 MB per push and 10 datasets, Pro ($12 per month) 500 MB and Max ($39 per month) 2 GB, and both paid plans add private datasets.