Read a Parquet file. Schema, stats, and data.
safe · secure · no server · works offline · fast
…or just start typing at the cursor.
safe · secure · no server · works offline · fast
…or just start typing at the cursor.
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.
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.
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.
pandas or Arrow block, for instance).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.
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.
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.
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.
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.
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.
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.
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.