Free Parquet Viewer
Open a Parquet file to see its columns, row groups, compression and statistics, then run SQL against it, all inside your browser.
What is a Parquet Viewer?
Parquet is the columnar file format data teams use for analytics, written by Spark, pandas, DuckDB, BigQuery and most data pipelines. It’s binary, so you can’t just open it in a text editor. This viewer shows what’s inside and lets you query it.
The schema and file info come straight from the file’s footer, read in your browser: column types, nesting, row groups, compression, encodings and min, max and null statistics. Query mode loads DuckDB, compiled to WebAssembly, and its Parquet reader, both served from this site, to run SQL against the file. Queries can’t reach the network or any other file.
Key Features
Schema With Logical Types
Each column’s physical type with its logical type, such as DECIMAL(8,2) or TIMESTAMP(MICROS), and nested STRUCT and LIST columns indented.
Row Groups and Statistics
Rows per group, compressed and uncompressed size, codec, encodings, and min, max and null counts per column.
SQL With DuckDB
Query the file as 'file.parquet' with full DuckDB SQL, and download the result as CSV.
Damage Detection
A truncated download, an encrypted footer or a CSV renamed to .parquet each get their own message.
Nothing Uploaded
The file is read in your browser and never sent. DuckDB and its Parquet reader load from this site, not a CDN.
Perfect for everyone
- Data engineers and analysts checking pipeline output
- Developers debugging exports
- Anyone sent a .parquet file
How to Use the Parquet Viewer
Open the file and read the footer before you query it, so you know the column names and types your SQL will need.
Open the File
Choose Open Parquet file and pick a .parquet file from your computer.
Check the Schema
Schema lists every column with its types and whether it can be null.
Read the File Info
File info shows rows, row groups, compression and each column’s statistics.
Query It
Switch to Query, write SQL against 'file.parquet', and download the result as CSV.
Parquet Footers, Read
Each row is a file, named as the sample buttons load it, and each answer is this viewer’s output in the mode on the chip. trips.parquet holds five taxi trips; events.parquet holds 5,000 analytics events. Both were written by DuckDB.
“trips.parquet”
“trips.parquet”
“events.parquet”
“events.parquet”
“trips-cut.parquet”
“trips.csv”
“SELECT * FROM 'file.parquet'”
How a Parquet File Is Organised
These ten ideas explain why Parquet is fast to query and what the File info view shows.
PAR1 Magic
Files start and end with the four bytes PAR1. A missing end marker means the file was cut off.
“What does a missing end marker suggest?”
The Footer
The schema and all metadata sit at the end, after the data, encoded with Thrift.
“Where is the metadata?”
Row Groups
Rows are split into groups, often 100,000 to a million rows, so readers can skip whole groups.
“Why split rows into groups?”
Column Chunks
Inside a group, each column is stored together, so a query reads only the columns it needs.
“Does a query read every column?”
Physical Types
Only eight storage types exist, such as INT32, INT64, DOUBLE and BYTE_ARRAY.
“How is a string stored?”
Logical Types
Annotations say what the bytes mean: STRING, DATE, DECIMAL, TIMESTAMP and more.
“What makes INT32 a date?”
Repetition
Each column is required, optional or repeated. Repeated fields build lists.
“Which repetition can hold nulls?”
Encodings
Dictionary encoding stores repeated values once, and RLE and delta encodings shrink runs and sequences.
“What suits a column with few distinct values?”
Compression
Each chunk is compressed with a codec such as SNAPPY, ZSTD or GZIP.
“Is compression per file or per chunk?”
Statistics
Min, max and null counts per chunk let engines skip row groups that can’t match a filter.
“What lets a query skip a row group?”
Queries to Try in Query Mode
Query mode runs DuckDB’s SQL dialect against the open file, registered as 'file.parquet'. These statements answer the usual first questions about a new file, and each one downloads as CSV.
Look at the First Rows
SELECT * FROM 'file.parquet' LIMIT 20 shows a sample of rows without reading the whole file.
Profile Every Column
SUMMARIZE SELECT * FROM 'file.parquet' gives each column’s min, max, distinct count, null percentage and averages in one table.
Describe the Types
DESCRIBE SELECT * FROM 'file.parquet' lists DuckDB’s view of each column’s type, which is how a query will treat it.
Count by Category
SELECT payment, COUNT(*) FROM 'file.parquet' GROUP BY ALL ORDER BY 2 DESC shows how values are spread.
Read the Metadata as Rows
SELECT * FROM parquet_metadata('file.parquet') returns one row per column chunk, with sizes, encodings and statistics.
Read the Schema as Rows
SELECT * FROM parquet_schema('file.parquet') lists every schema element, including the converted and logical types.
Unnest a List
SELECT UNNEST(skus) AS sku, COUNT(*) FROM 'file.parquet' GROUP BY ALL turns a LIST column into one row per item.
Reach Into a Struct
SELECT context.country, COUNT(*) FROM 'file.parquet' GROUP BY ALL reads one field of a STRUCT column with dot notation.
Compression Codecs Compared
Each column chunk names its codec in File info. The choice trades file size against how fast the file reads and writes, and every mainstream reader handles all of these.
SNAPPY
Fast to compress and decompress, with moderate size savings. It’s Spark’s long-standing default.
ZSTD
Smaller files than Snappy at similar read speed, which is why DuckDB and Polars default to it.
GZIP
Good compression but slow, mostly seen in older files and exports meant for archiving.
LZ4_RAW
Very fast decompression with less size saving. The older LZ4 codec id is deprecated in favour of it.
BROTLI
Strong compression at a high CPU cost, rare outside size-sensitive archives.
UNCOMPRESSED
No codec at all. Encodings like dictionary still shrink the data, so files can be smaller than you’d expect.
Tools That Write Parquet
The created_by field in File info names the writer and its version. These are the ones you’ll see most often, and each leaves its own habits in the file.
Apache Spark
Writes parquet-mr or Spark’s own writer, usually with SNAPPY and many row groups per file.
pandas and PyArrow
df.to_parquet uses PyArrow by default and stores the pandas schema in key-value metadata.
DuckDB
COPY ... TO 'file.parquet' writes files with ZSTD or SNAPPY and lets you set row group size.
Polars
write_parquet uses its own Rust writer, with ZSTD as the default codec.
BigQuery and Snowflake
Both export query results and tables as Parquet to cloud storage.
Data Lakes
Delta Lake, Iceberg and Hudi tables store their data as Parquet files under the hood.
Parquet Pitfalls
Common reasons a Parquet file reads differently from what you expected, most of them decided by whichever tool wrote the file.
INT96 Timestamps
Older Spark and Impala wrote timestamps as INT96, which newer readers may misinterpret. Prefer INT64 with a TIMESTAMP type.
Time Zones
A TIMESTAMP without isAdjustedToUTC is local wall-clock time. Two readers may show it with different offsets.
Tiny Row Groups
Many small row groups make files slow to scan. Aim for groups of 100 MB or more in production.
Missing Statistics
Some writers skip min and max for strings, so engines can’t skip row groups on those columns.
Schema Drift
Files from different days may disagree on a column’s type. Compare their schemas before combining them.
Large Files in the Browser
The whole file is read into memory. Very large files are better queried with DuckDB on your computer.
When to Open a Parquet File
Whenever you need to know what a Parquet file holds without setting up Spark, Python or a database, or before you load it into one.
Checking Pipeline Output
Confirm a job wrote the expected columns, types and row counts.
Debugging Slow Queries
Look at row group sizes and statistics to see whether engines can skip data.
Answering Quick Questions
Count, filter or sum a column with SQL instead of writing a script.
Sharing a Sample
Query a few rows and download them as CSV for someone without data tools.
Comparing Two Exports
Open each file and compare schemas and writers when numbers don’t match.