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.

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

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.

Anatomy of a Parquet file
PartWhat it holdsWhy it matters
Magic bytesPAR1 at the very start and the very end of the fileMarks the file as Parquet before anything else is read
Row groupA horizontal slice of rows, 512 MB to 1 GB in the format docsRead or skipped as a unit, and separate row groups can be processed in parallel
Column chunkAll values of one column inside one row groupA query reads only the columns it uses
PageThe encoded and compressed unit inside a column chunk, about 8 KB for data pagesSmaller pages allow finer-grained reads, such as a single-row lookup
Footer metadataThe schema, row-group and column-chunk locations and statistics, then a 4-byte lengthA reader finds everything it needs without scanning the file
StatisticsMin and max values for each column chunkRow 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 DuckDB
  • ZSTD: what rows.page uses when it exports Parquet
  • GZIP and BROTLI
  • LZ4_RAW, the replacement for the deprecated LZ4 (LZO is 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 cat shows 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

  1. Drop a .parquet or .pq file on rows.page. DuckDB-WASM reads it in your browser, and nothing is uploaded unless you press Share.
  2. Filter with country:NL or price:>20, or run SQL against the table data.
  3. 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:

sql
-- 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.

python
import pandas as pd

df = pd.read_parquet("data.parquet")
df.to_csv("data.csv", index=False)

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

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.