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.
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.
| Property | CSV | Parquet |
|---|---|---|
| Storage layout | Row by row, plain text | Column by column, binary, compressed |
TPC-H SF20 lineitem size | 15.95 GB | 3.78 GB (Snappy), 3.22 GB (zstd) |
| TPC-H query 1 (DuckDB, Dec 2024) | 6.72 s | 0.88 s (Snappy) |
| TPC-H query 21 (DuckDB, Dec 2024) | 19.95 s | 2.08 s (Snappy) |
| Schema and types | None stored; readers guess types from text | Typed schema stored in the file |
| Human readability | Any text editor | Binary; needs a Parquet reader |
| Desktop Excel | Opens directly | No built-in connector |
| Appending rows | Add a line at the end | Written in row groups; no line-by-line append |
| rows.page browser limit | 1.5 GB per tab; bigger files load partially | Not 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?
- Open rows.page and drop a
.csv,.txt,.parquetor.pqfile on the page, or click Paste data to paste cells copied from Excel or Google Sheets. - Optionally narrow it down with a filter such as
country:NLorprice:>20, or a SQL query against the tabledata. - Open Export and pick Parquet for a zstd-compressed
.parquetfile, 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:
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
.xlsxor.xls, so save Excel files as CSV first.
rows.page limits and prices
| What | Limit or price |
|---|---|
| Open a file in your browser | Files 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.