✳ OMNIVIEWER

Read a Parquet file. Schema, stats, and data.

safe · secure · no server · works offline · fast

…or just start typing at the cursor.

Or try it now

↓ scroll for about & FAQ

Read an Apache Parquet file online — nothing uploaded

OmniViewer opens a .parquet file — Apache Parquet, the columnar storage format at the heart of Spark, pandas, DuckDB, Arrow, BigQuery and the data-lake world — right in your browser. Drop the file and you can read its schema, walk every row group and column chunk with its compression and statistics, and preview the decoded data. There is no upload and no server, and the parse runs in a background Web Worker so the page never freezes — no pandas, DuckDB or Spark required.

Why even a huge Parquet file opens instantly

Parquet is columnar and footer-indexed. Instead of storing rows one after another, it groups rows into row groups and, within each, stores every column’s values together as a column chunk — which is what makes it compress so well and lets a query read only the columns it needs. The catch is the map: a FileMetaData structure at the very end of the file (right before the trailing PAR1 magic) records the schema, the row groups, and the byte offset, size, codec and min/max of every column chunk. OmniViewer reads only that footer window, so the schema and per-column statistics of a multi-gigabyte file come back instantly — the column data itself is only touched for the small preview on the Table tab.

The metadata is a Thrift struct — decoded by hand

That footer is encoded with the Thrift compact protocol, and each data page has its own compact-protocol header. OmniViewer includes a dependency-free reader for it, plus a hand-written Snappy decompressor (Parquet’s default codec, which no browser primitive provides) and decoders for the PLAIN and dictionary (RLE/bit-packed) encodings — so the whole toolkit is pure JavaScript with no WebAssembly and no parser library.

What each tab does, in plain terms

For a byte-level walk through the format — row groups, column chunks, pages, dictionary + RLE encoding and the footer — see our deep dive into how a Parquet file works on the inside.

OmniViewer opens every file format, powered by the same viewing engine as fastjsonviewer.com and hugecsv.com.

FAQ

Is my Parquet file uploaded anywhere?

No. OmniViewer is a static page with no server-side processing: your .parquet file is read directly by your browser, and every tab — schema, row groups, table and stats — runs locally in a Web Worker. The file never leaves your computer.

How can a multi-gigabyte Parquet file open instantly?

Parquet stores its metadata index — the schema, the row groups, and the byte offset, size, codec and min/max statistics of every column chunk — in a footer at the very end of the file, right before the trailing PAR1 magic. OmniViewer reads only that footer window, so the schema and per-column statistics come back instantly no matter how large the file is. The actual column data is only read for the small preview on the Table tab, and the raw, hex and strings views stay windowed over every byte.

Do I need pandas, DuckDB, Spark or parquet-tools?

No. OmniViewer reads Parquet in pure JavaScript — the Thrift compact-protocol decoder, the Snappy decompressor and the PLAIN and dictionary column decoders are all hand-written — so it works in any modern browser on Windows, Linux, macOS or a phone, with nothing installed. It is the fastest way to peek at a .parquet file when you do not want to spin up a Python or Spark session.

Can it show the actual data, not just the metadata?

Yes — that is the Table tab. OmniViewer decodes a preview of the first row group’s rows: it reads the data pages, decompresses them (UNCOMPRESSED, Snappy or gzip), and decodes the PLAIN and dictionary (RLE/bit-packed) encodings back into values, showing nulls as nulls. Columns using an encoding the in-browser decoder does not cover yet are flagged rather than shown wrong, and the schema and row-group tabs always work from the footer.

What are row groups and column chunks?

A Parquet file splits its rows into row groups, and within each row group it stores every column’s values together as a column chunk — that column-major layout is what makes Parquet compress well and lets a reader load only the columns it needs. Each column chunk records its compression codec, its encodings, how many values and nulls it holds, its compressed and uncompressed sizes, and min/max statistics. The Row groups tab lays all of that out, read straight from the footer.

Which compression codecs and encodings are supported?

The Table preview decodes the UNCOMPRESSED, Snappy and gzip codecs and the PLAIN and dictionary (RLE_DICTIONARY / PLAIN_DICTIONARY) encodings — the common case written by pandas, Arrow and Spark. The schema, row-group and statistics views work for every file regardless of codec, because they come from the footer. Codecs without a browser primitive (LZ4, Zstd, Brotli) and the delta encodings are flagged on the Table tab rather than decoded.

Does it read the logical types, like timestamps and decimals?

Yes. Parquet stores a physical type (INT32, INT64, DOUBLE, BYTE_ARRAY and so on) plus a logical/converted type that gives it meaning — STRING, ENUM, DATE, TIME, TIMESTAMP, DECIMAL, JSON and others. The Schema tab shows both, so you can see that a BYTE_ARRAY column is really a UTF-8 string or an INT64 is really a millisecond timestamp.