— Developer Tools

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.

— Samples
Valid
Live

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.

1

Open the File

Choose Open Parquet file and pick a .parquet file from your computer.

2

Check the Schema

Schema lists every column with its types and whether it can be null.

3

Read the File Info

File info shows rows, row groups, compression and each column’s statistics.

4

Query It

Switch to Query, write SQL against 'file.parquet', and download the result as CSV.

Worked Examples

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.

REF_001Schema of a flat file

“trips.parquet”

REF_002File info and statistics

“trips.parquet”

REF_003Schema with a STRUCT and a LIST

“events.parquet”

REF_004Three row groups, dictionary encoded

“events.parquet”

REF_005A download cut short

“trips-cut.parquet”

REF_006A CSV opened as Parquet

“trips.csv”

REF_007SQL typed in the file box

“SELECT * FROM 'file.parquet'”

Parquet Concepts

How a Parquet File Is Organised

These ten ideas explain why Parquet is fast to query and what the File info view shows.

01 / PAR1

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?”

02 / THE

The Footer

The schema and all metadata sit at the end, after the data, encoded with Thrift.

“Where is the metadata?”

03 / ROW

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?”

04 / COLUMN

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?”

05 / PHYSICAL

Physical Types

Only eight storage types exist, such as INT32, INT64, DOUBLE and BYTE_ARRAY.

“How is a string stored?”

06 / LOGICAL

Logical Types

Annotations say what the bytes mean: STRING, DATE, DECIMAL, TIMESTAMP and more.

“What makes INT32 a date?”

07 / REPETITION

Repetition

Each column is required, optional or repeated. Repeated fields build lists.

“Which repetition can hold nulls?”

08 / ENCODINGS

Encodings

Dictionary encoding stores repeated values once, and RLE and delta encodings shrink runs and sequences.

“What suits a column with few distinct values?”

09 / COMPRESSION

Compression

Each chunk is compressed with a codec such as SNAPPY, ZSTD or GZIP.

“Is compression per file or per chunk?”

10 / STATISTICS

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.

Tip 01

SNAPPY

Fast to compress and decompress, with moderate size savings. It’s Spark’s long-standing default.

Tip 02

ZSTD

Smaller files than Snappy at similar read speed, which is why DuckDB and Polars default to it.

Tip 03

GZIP

Good compression but slow, mostly seen in older files and exports meant for archiving.

Tip 04

LZ4_RAW

Very fast decompression with less size saving. The older LZ4 codec id is deprecated in favour of it.

Tip 05

BROTLI

Strong compression at a high CPU cost, rare outside size-sensitive archives.

Tip 06

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.

Tip 01

INT96 Timestamps

Older Spark and Impala wrote timestamps as INT96, which newer readers may misinterpret. Prefer INT64 with a TIMESTAMP type.

Tip 02

Time Zones

A TIMESTAMP without isAdjustedToUTC is local wall-clock time. Two readers may show it with different offsets.

Tip 03

Tiny Row Groups

Many small row groups make files slow to scan. Aim for groups of 100 MB or more in production.

Tip 04

Missing Statistics

Some writers skip min and max for strings, so engines can’t skip row groups on those columns.

Tip 05

Schema Drift

Files from different days may disagree on a column’s type. Compare their schemas before combining them.

Tip 06

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.

Frequently Asked Questions