# Parquet Viewer

> Open a Parquet file in your browser: schema, row groups, codecs and statistics at once, preview rows, run SQL with DuckDB, export to CSV. Nothing is uploaded.

- URL: https://bytescope.dev/en/parquet-viewer/
- Locale: en · Also: [ja](https://bytescope.dev/ja/parquet-viewer.md) · [zh-Hant](https://bytescope.dev/zh-Hant/parquet-viewer.md)
- Runs: The file is read straight from your disk and is never uploaded. Parsing and every SQL query run inside this tab; the only download is the DuckDB engine, fetched on the first query.
- Requires: Any modern browser, desktop and mobile. The first SQL query downloads a DuckDB engine of about 7 MB, which the browser then keeps.
- Updated: 2026-09-08

## What it does

A colleague sends you a .parquet file and you just want to know what is in it — which columns, what types, roughly how many rows, what the first few records look like. Normally that means a Jupyter notebook, `pyarrow` or `pandas`, and a few minutes of setup for a thirty-second question. This page is the parquet viewer for that moment: drop the file and the schema, row groups and preview appear, and if you need an aggregate you can type SQL against it right there. It also opens `.jsonl` / `.ndjson`, Arrow IPC files (`.arrow`, `.feather`) and `.avro`, one file at a time. For a CSV, use CSV Explorer instead.

### What you see before any engine loads

Parquet keeps its table of contents in a footer at the end of the file, so the page reads only that last stretch — about 512 KB — and shows the schema immediately, whether the file is 10 MB or 1 GB. You get a schema tree with every column's name, physical type and logical type (`TIMESTAMP(MICROS, UTC)`, `DECIMAL(18,2)`, nested struct, list and map), whether it is nullable, the total row count, each row group with its row and byte counts, the codec per column (`SNAPPY`, `ZSTD`, `GZIP` and so on), the encodings used, compressed versus uncompressed size with the ratio, min/max and null-count statistics when the writer stored them, the `created_by` string, and any key/value metadata such as the pandas or Spark schema JSON, collapsed until you open it. A preview of the first 1,000 rows then streams into a virtual table. Nested values expand as JSON, timestamps are printed with the digits their unit implies (three for milliseconds, six for microseconds, nine for nanoseconds) and a `Z` when the column is UTC-adjusted, decimals are shown exactly rather than rounded through a float, and binary columns appear as hex of their first 32 bytes.

### SQL in the browser

The query bar is powered by DuckDB-WASM (DuckDB 1.4). The first time you run SQL the page downloads the engine, about 7 MB, which your browser caches for the next visit; the Parquet and JSON extensions are served from this site. Your file is always exposed as the table `t`, so the default query is `SELECT * FROM t LIMIT 100`, and templates give you `SUMMARIZE t`, `count(*)`, the null ratio per column and the top N values of a column with one click. Each result shows the time taken and the row count; up to 10,000 result rows are kept on screen, so add a `LIMIT` or export when you need more. You can export any result as CSV or JSONL, up to 1,000,000 rows per export — the page tells you when a larger result has been cut — which is the quickest way to turn Parquet into a CSV for someone who cannot open Parquet. A Stop button cancels a running query, and engine errors are shown verbatim rather than paraphrased. On a 1 GB file with tens of millions of rows, `count(*)` is instant because it comes from the metadata, a `GROUP BY` over one column or a `SUMMARIZE` of every column takes seconds to tens of seconds, and the file is read in pieces rather than loaded into memory whole.

### Honest limits

The engine runs on a single CPU core, because this site cannot turn on the browser's multi-threaded mode, so a large `GROUP BY` or join is noticeably slower than desktop DuckDB on the same machine. Memory is bounded by the browser — a 32-bit WebAssembly heap of roughly 4 GB — so a huge sort or join can fail, in which case you see the engine's own error. Encrypted Parquet files using modular encryption cannot be opened. Iceberg and Delta Lake are table layers on top of Parquet and are not understood here: the page opens a single data file, not a table directory, and multi-file selection is not supported yet. Arrow IPC and Avro files currently show schema and metadata only, with no row preview and no SQL. `INT96` timestamps written with overflow by old Spark versions may show up as a count of nanoseconds since the epoch instead of a date. `DECIMAL` min/max statistics with more than 15 digits are approximate and marked with ≈. Parquet export is not available yet; results leave as CSV or JSONL.

### Privacy

The file is read straight from your disk with `File.slice`; nothing is uploaded, and neither the data nor your queries leave the browser. The only outside request is the DuckDB engine code, fetched from the public CDN cdn.jsdelivr.net on your first SQL run and cached afterwards.

## Limits

Does not upload the file, write back to a Parquet file, read encrypted Parquet files, Iceberg or Delta tables, or several files at once; SQL runs on one file at a time.

## FAQ

### How do I open a Parquet file without Python?

Drop it on this page. The schema, row groups, codecs, statistics and metadata appear at once from the file's footer, and the first 1,000 rows load into a scrollable table. No `pyarrow`, no notebook, no install — and nothing is uploaded, because the file is read from your own disk.

### Is my file uploaded anywhere?

No. The browser reads the file with `File.slice` and everything — parsing the footer, previewing rows, running SQL — happens inside the tab. The only download is the DuckDB engine itself, about 7 MB, which comes from a public CDN the first time you run a query. Your data and your queries never leave your machine.

### Why does the first SQL query download about 7 MB, and from where?

The schema and preview need no engine, but SQL is run by DuckDB compiled to WebAssembly, which is about 7 MB of code. It is fetched from cdn.jsdelivr.net, a public CDN, the first time you press Run and cached by your browser for later visits; the Parquet and JSON extensions come from this site. Only the engine is downloaded — your file is never sent anywhere.

### Why is a big GROUP BY slower than DuckDB on my laptop?

Desktop DuckDB spreads work across every core you have. Here the engine runs on one core, because this site cannot enable the browser's multi-threaded WebAssembly mode. Simple scans and a `count(*)` — which is read from the metadata — are fast, but a heavy `GROUP BY`, sort or join over tens of millions of rows takes seconds to tens of seconds rather than a fraction of that.

### How do I convert Parquet to CSV?

Open the file, run a query such as `SELECT * FROM t`, and export the result as CSV. Up to 1,000,000 rows are written per export; a larger result is cut at that point and the page says so, so add a `WHERE` or `LIMIT` to export in slices. JSONL export works the same way. Exporting back to Parquet is not available yet.

### Can it open a whole Iceberg or Delta Lake table?

No. Iceberg and Delta Lake are metadata layers that describe many Parquet files; this page opens one data file at a time and does not read those table manifests. Pick an individual `.parquet` file from the table's folder to inspect its schema and rows. Multi-file selection is not supported yet either.

### Does it work with Arrow, Feather or Avro files?

Yes, for the schema and metadata: drop an Arrow IPC file (`.arrow`, `.feather`) or an `.avro` file and the column names and types appear. Row preview and SQL are not available for those formats in this version. JSONL / NDJSON files get the full treatment — schema inferred from the first rows, preview and SQL.

### Why does a timestamp show up as nanoseconds since the epoch?

Older Spark versions wrote `INT96` timestamps that can overflow, and a value like that cannot be turned into a trustworthy date, so the page shows the raw count instead of guessing. Correctly written timestamps are displayed with fixed digits for their unit — three for milliseconds, six for microseconds, nine for nanoseconds — plus a `Z` when the column is marked UTC-adjusted.

## Related tools

- [CSV Explorer](https://bytescope.dev/en/csv-explorer.md) — Open a CSV too big for Excel and query it with SQL in the browser.
- [SQLite Viewer](https://bytescope.dev/en/sqlite-viewer.md) — Browse SQLite databases: tables, schema and SQL queries, all local.
- [Large File Viewer](https://bytescope.dev/en/large-file-viewer.md) — Read a multi-gigabyte text, log or JSON file without loading it whole.
