gizmobench

Parquet Viewer

Open a .parquet file and the file is on the first screen: its row count, its row groups, its compression and its schema on the left, and the rows of one row group in a typed grid on the right. This page carries no copy of a Parquet engine and asks for no bucket, no key and no account. It reads the format itself: the PAR1 magic at both ends, the Thrift-encoded footer, the schema tree with its repetition and definition levels, the row groups and the pages of a column chunk, down to the dictionary a string column is stored against. That is why it can tell you what it is doing rather than hand you a grid and hope. An INT64 past 2^53 prints every digit, because it never passes through a JavaScript number. A DECIMAL(9,2) prints 12.00 from the integer and the scale the file holds, not from a float. A null prints as null and an empty list prints as [], which are different things and look different. And a column written with a codec or an encoding this reader does not decode, ZSTD or DELTA_BYTE_ARRAY for instance, is named under the stage and left out of the grid rather than half read, while the schema and the other columns still come through. The file stays on your disk: the page opens it, reads it, and never writes it back.

orders.parquet4.0 KB
  • rows24
  • row groups2
  • columns9
  • compressionSNAPPY
  • encodingsPLAIN_DICTIONARY, RLE, PLAIN
  • created byparquet-cpp-arrow version 21.0.0

schema 9 of 9 showing

18 of 18
order_idINT64placedTIMESTAMP(MILLIS)customerUTF8totalDECIMAL(9,2)qtyINT32paidBOOLEANtagsLIST<UTF8>noteUTF8big_idINT64
10012026-07-01T09:14:00.000Ada Whitfield12.001false["rush"]null9007199254740993
10022026-07-01T16:17:00.000Ravi Menon19.352true[]null9007199254740994
10032026-07-01T23:20:00.000Jae Park26.703truenullleft at the side door9007199254740995
10042026-07-02T06:23:00.000Mina Okafor34.054false["gift","rush"]null9007199254740996
10052026-07-02T13:26:00.000Tom Bregman41.405true["web"]null9007199254740997
1006nullSofia Ruiz48.751true["web"]null9007199254740998
10072026-07-03T03:32:00.000Ada Whitfield56.102false["rush"]null9007199254740999
10082026-07-03T10:35:00.000Ravi Menon63.453true[]call on arrival9007199254741000
10092026-07-03T17:38:00.000Jae Park70.804truenullnull9007199254741001
10102026-07-04T00:41:00.000Mina Okafornull5false["gift","rush"]null9007199254741002
10112026-07-04T07:44:00.000Tom Bregman85.501true["web"]null9007199254741003
10122026-07-04T14:47:00.000Sofia Ruiz92.852true["web"]null9007199254741004
10132026-07-04T21:50:00.000Ada Whitfield100.203false["rush"]null9007199254741005
10142026-07-05T04:53:00.000Ravi Menon107.554true[]null9007199254741006
10152026-07-05T11:56:00.000Jae Park114.905truenullnull9007199254741007
10162026-07-05T18:59:00.000Mina Okafor122.251false["gift","rush"]second attempt9007199254741008
10172026-07-06T02:02:00.000Tom Bregman129.602true["web"]null9007199254741009
10182026-07-06T09:05:00.000Sofia Ruiz136.953true["web"]null9007199254741010
showing 18 of 18 in row group 1, 24 in the file
Rows in file
24
Shown
18
Columns
9 of 9
Compression
SNAPPY

18 rows on screen from row group 1 of 2, which holds 18. This file holds 24 rows in all, and the grid never stands in for that number.

  • A nine column filefirst row group
    9 columns, 18 rows, null shown as null
  • A list columnLIST of UTF8
    tags reads ["rush"], [] and null
  • A codec it cannot readZSTD
    ZSTD named, schema read, no rows decoded

Pages compressed with UNCOMPRESSED, SNAPPY, GZIP are read here, in plain or dictionary encoding, which is what pyarrow, Spark and DuckDB write by default. A column in another codec or encoding is named under the stage and left out rather than guessed at, and the rest of the grid still reads.

Accuracy. Read in your browser by a Parquet reader written for this page: the file is never uploaded and no cloud credential is asked for. Types come from the file's own schema, so an integer past 2^53 stays exact and a null reads as null rather than as an empty cell. The grid is a capped preview and the row count printed beside it is the file's real total, never the number on screen; a codec or an encoding this reader cannot decode, ZSTD or a delta encoding, is named and refused rather than guessed at.

Common questions

How do I open a Parquet file here?
Press Open file and pick it, or drop the file anywhere on the dark stage. The reading happens in this tab: nothing is uploaded, there is no account and no cloud credential is asked for. The page opens on a sample so the job is visible before you open anything of your own: 4,085 bytes, 24 rows in two row groups of 18 and 6, nine columns, SNAPPY compressed, written by parquet-cpp-arrow version 21.0.0, with a timestamp, an exact decimal, a list column, nulls and an integer past 2^53 in it. Your own file is read the same way.
Which compression codecs can it read?
UNCOMPRESSED, SNAPPY and GZIP, which is what pyarrow, Spark, DuckDB and parquet-mr write by default. LZO, BROTLI, LZ4, LZ4_RAW and ZSTD are named and refused rather than guessed at: a wrong guess at a codec is a wrong number on a screen. A file in one of those still opens far enough to show you its schema, its row counts and which codec it uses, which is often the thing you came to check. To read the rows here, rewrite the file with snappy or with no compression.
Which encodings does it decode?
PLAIN, PLAIN_DICTIONARY and RLE_DICTIONARY for values, and the RLE hybrid Parquet uses for definition and repetition levels and for booleans on a v2 data page. Both data page versions are read, and a dictionary page is decoded once and reused for the pages that index into it. DELTA_BINARY_PACKED, DELTA_LENGTH_BYTE_ARRAY, DELTA_BYTE_ARRAY, BYTE_STREAM_SPLIT and the deprecated BIT_PACKED are named and refused. Those come from writers asked for a v2 encoding explicitly, so most files you meet are readable here.
Does the grid show every row in the file?
No, and it never pretends to. The grid shows one row group at a time, capped at 100, 500, 1,000 or 5,000 rows, and the cap opens at 1,000. Rows in file and Shown are two separate cells under the stage for that reason, the count beside the grid names both numbers, and the export writes exactly the rows you can see. Pick another row group from the list in the pane head to read further into the file.
How are nulls, lists, maps and nested columns shown?
A null prints as null in a dimmer colour, never as an empty cell, because an empty string is a different value and has to look different. A list column keeps its shape: ["rush"] is one element, [] is an empty list and null is no list at all, and the three are distinguished by the definition levels the file stores. A list of lists reads as [[1,2],[3]]. A struct becomes one column per field, named addr.city and addr.zip. A map becomes its keys and its values, named m.key and m.value, in the order the file holds them.
Are big integers and decimals exact here?
Yes. An INT64 is read as a big integer and printed digit for digit, so 9007199254740993 stays 9007199254740993 rather than rounding to the nearest value a JavaScript number can hold. A DECIMAL is rebuilt from the unscaled integer and the scale in the schema, so DECIMAL(9,2) prints 12.00 and a 38-digit DECIMAL prints all 38 digits. Neither passes through a float on the way to the screen or into the export.
How large a file can it open?
Up to 50 MB. The whole file is held in this tab while you read it, so that ceiling is stated rather than discovered: a larger file is refused by name, with its size in the message, instead of being half read or killing the tab. Within that ceiling the row count barely matters, because only the row group you are looking at is decoded, and only as far as the preview cap: a file of hundreds of thousands of rows draws its first screen straight away.
What do Copy and Download write?
Whichever of CSV and JSON the switch beside them is set to, holding the rows on screen and the columns still showing. The CSV follows RFC 4180: a value with a comma, a quote or a line break comes back quoted, a null is an empty field and a list is written as its JSON text. The JSON is an array of objects in which a big integer and an exact decimal are written as their own digits, which JSON allows and a float would not keep. A binary value is written as its length, bytes:16 for a sixteen byte value, rather than as half of its bytes, because half a blob in a spreadsheet is worse than none.
Why does a timestamp show no Z, or a different one from my query tool?
Because the page prints the instant the file stores and says which convention it was stored under. A TIMESTAMP column marked isAdjustedToUTC in the schema prints with a trailing Z; one written as a local or naive timestamp, which is what pandas and pyarrow write for a tz-naive column, prints without it. The type beside the column header names the unit as well, MILLIS, MICROS or NANOS, and the fraction printed carries that many digits.
Is my file or my settings remembered?
The preview cap and the export format are kept in this browser alone, so the page is as you left it when you come back, and the Start over button above the tool forgets them. The file itself is never remembered: it stays on your disk, and this page holds it only while the tab is open. If your browser blocks storage entirely, everything on the page still works and nothing is kept between visits.
What happens if the file is damaged or encrypted?
It is refused, with a message naming what went wrong. A file that does not start or end with PAR1, a footer length that points outside the file, a page offset past the end of the file, a page claiming more bytes than the column holds and a dictionary index past the end of its dictionary are each caught and named. A file whose footer is encrypted ends with PARE instead of PAR1 and is named as encrypted rather than as damaged; nothing here decrypts anything.

Read in your browser by a Parquet reader written for this page: the file is never uploaded and no cloud credential is asked for. Types come from the file's own schema, so an integer past 2^53 stays exact and a null reads as null rather than as an empty cell. The grid is a capped preview and the row count printed beside it is the file's real total, never the number on screen; a codec or an encoding this reader cannot decode, ZSTD or a delta encoding, is named and refused rather than guessed at.