What is Parquet
What is a Parquet file? Columnar storage explained
Apache Parquet is an open-source columnar file format: in a DuckDB test, a 15.95 GB CSV became a 3.22 GB zstd Parquet file. Started in 2013, it stores each column with its type and statistics. You can open, query and convert .parquet files in your browser with rows.page, free and with no signup.
No file handy? Open NYC taxi trips, April 2019 (7.4M rows, 127 MB).
What is Apache Parquet?
Apache Parquet is an open-source columnar file format released under the Apache License 2.0. A CSV stores a table row by row as plain text. Parquet stores the values of each column together in binary, with the column types and statistics written into the file.
Twitter and Cloudera started the project in 2013, and it became an Apache top-level project on April 27, 2015. The specification is open, so DuckDB, pandas and pyarrow all read and write the same files.
How is a Parquet file structured?
A Parquet file starts and ends with the 4-byte magic string PAR1. In between, the rows are split into row groups, each row group holds one column chunk per column, and each column chunk is made of pages. The format docs suggest row groups of 512 MB to 1 GB and data pages of about 8 KB.
The file metadata comes after the data, followed by a 4-byte metadata length and the closing PAR1. A reader starts at the end of the file, reads the schema, the location of every row group and the min/max statistics, and then fetches only the byte ranges it needs.
| Part | What it holds | Why it matters |
|---|---|---|
| Magic bytes | PAR1 at the very start and the very end of the file | Marks the file as Parquet before anything else is read |
| Row group | A horizontal slice of rows, 512 MB to 1 GB in the format docs | Read or skipped as a unit, and separate row groups can be processed in parallel |
| Column chunk | All values of one column inside one row group | A query reads only the columns it uses |
| Page | The encoded and compressed unit inside a column chunk, about 8 KB for data pages | Smaller pages allow finer-grained reads, such as a single-row lookup |
| Footer metadata | The schema, row-group and column-chunk locations and statistics, then a 4-byte length | A reader finds everything it needs without scanning the file |
| Statistics | Min and max values for each column chunk | Row groups that can't match a filter are skipped |
Why is Parquet smaller and faster than CSV?
A query that needs 3 of 50 columns reads only those 3 column chunks. A filter is compared with each row group's min/max statistics, so row groups that can't match are skipped. And because the values of one column sit together, they encode and compress better than rows of mixed text.
Each page is first encoded with PLAIN, dictionary (RLE_DICTIONARY), RLE, one of the DELTA encodings or BYTE_STREAM_SPLIT, and then compressed with a codec:
SNAPPY: the default in pandas, pyarrow and DuckDBZSTD: what rows.page uses when it exports ParquetGZIPandBROTLILZ4_RAW, the replacement for the deprecatedLZ4(LZOis defined too)UNCOMPRESSED
DuckDB measured the difference in December 2024 on the TPC-H scale factor 20 lineitem table. The CSV was 15.95 GB, the Parquet file 3.78 GB with Snappy and 3.22 GB with zstd. TPC-H query 1 took 6.72 s on the CSV and 0.88 s on Snappy Parquet, and query 21 took 19.95 s versus 2.08 s.
Does a Parquet file store column types?
Yes. The schema sits in the file metadata, so every column has a fixed type such as integer, double, string, date or timestamp, and nested lists and maps are part of the format too. A CSV stores everything as text, so every tool that reads it has to guess the types again.
When you open a Parquet file in rows.page, the Columns panel shows each column's type, distinct count, share of empty values, min and max for numbers and dates, and a histogram or the top 10 values.
When should you use Parquet instead of CSV?
- Use Parquet for large files, for repeated queries that touch a few columns, and when column types must survive the trip between tools.
- Use CSV when someone needs to read the file in a text editor or open it in a spreadsheet. Parquet is binary, so
catshows nothing useful and you can't fix a value by hand.
Size limits differ in the browser too. rows.page holds CSV, TSV, JSON and JSONL files to 1.5 GB per browser tab, but local Parquet files skip that check because DuckDB reads them in place.
How do you open or convert a Parquet file?
rows.page
- Drop a
.parquetor.pqfile on rows.page. DuckDB-WASM reads it in your browser, and nothing is uploaded unless you press Share. - Filter with
country:NLorprice:>20, or run SQL against the tabledata. - Click Export to save the view as CSV, JSON, JSONL, Markdown (first 1,000 rows) or zstd Parquet.
To open a public file without downloading it, put its URL after rows.page/, for example https://rows.page/https://example.com/data.parquet.
DuckDB
The DuckDB CLI or Python package reads Parquet with plain SQL and writes it with COPY:
-- Read a Parquet file
SELECT * FROM 'data.parquet' LIMIT 100;
-- Convert a CSV to zstd-compressed Parquet
COPY (SELECT * FROM 'data.csv') TO 'data.parquet' (FORMAT PARQUET, COMPRESSION ZSTD);pandas
pandas needs pyarrow or fastparquet installed and loads the whole table into memory. df.to_parquet() writes Snappy-compressed files by default.
import pandas as pd
df = pd.read_parquet("data.parquet")
df.to_csv("data.csv", index=False)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
Can Excel open a Parquet file?
Not directly: desktop Excel has no Parquet connector, and Power Query's Parquet connector exists only in Power BI and Power Query Online. Open the file in rows.page and export it as CSV, which Excel opens.
Is zstd or Snappy better for Parquet?
Snappy is the default in pandas, pyarrow and DuckDB, and rows.page exports with zstd. In DuckDB's TPC-H test the same 15.95 GB CSV became 3.78 GB with Snappy and 3.22 GB with zstd, while query 1 took 0.88 s and 0.95 s.
Is there a size limit for Parquet files in rows.page?
Local Parquet files are not held to the 1.5 GB per-tab limit, because DuckDB reads them in place. To host one and share a link, one push (the Share button, curl or MCP) takes up to 100 MB on every plan, and Pro ($12 per month) and Max ($39 per month) accept files up to 500 MB and 2 GB through multipart uploads on the API.
Why does a Parquet file start and end with PAR1?
The 4-byte PAR1 marks the file as Parquet at both ends. The 4 bytes before the closing PAR1 hold the footer length, so a reader reads the last 8 bytes, jumps to the metadata and then fetches only the column chunks it needs.
How do I share a Parquet file from the terminal?
Run curl -T data.parquet https://rows.page to upload it and get a link; the raw file is then at https://rows.page/<id>/raw.parquet. Without an account you get 100 MB per request, 50 pushes and 1 GB per IP address per UTC day, and the link expires after 7 days unless you sign in with Google and keep it.