Parquet to CSV
Convert a Parquet file to CSV. Numbers and text come back as their own values, unrounded and unreformatted; dates/timestamps render as ISO-8601; a nested list or struct column (CSV has no such shape) is serialized as JSON text in its cell rather than dropped. Snappy and uncompressed Parquet are supported; other codecs (GZIP, ZSTD, ...) are refused by name. Runs entirely on your device.
Runs on your device. The file is never uploaded.
Parquet to CSV reads a Parquet file with hyparquet and writes its top-level columns out as CSV. Timestamps come back as ISO-8601 and binary columns as lowercase hex, while a 64-bit integer keeps its full decimal digits. Only Snappy and uncompressed files are read, and a Parquet naming one column twice is refused outright.
Questions
Which Parquet files can it read?
Uncompressed and Snappy compressed files, read with hyparquet. Other codecs such as GZIP and ZSTD are not supported, and a file using one is refused with "not a readable Parquet file" followed by the underlying reason, which names what it choked on. The same message covers a truncated or corrupt file.
What happens to nested list and struct columns?
They are written into the cell as JSON text rather than dropped, because CSV has no nested shape to put them in. A 64 bit integer inside one of those structures appears as a quoted decimal string, which is the standard way JSON carries an int64 without losing precision, and matches the digits a top level integer column prints.
Do my numbers and dates change?
Numbers come out unrounded and unreformatted, and 64 bit integers are printed as full decimal digits rather than pushed through a JavaScript number, so values above 2 to the 53rd stay exact. Dates and timestamps render as ISO-8601. Binary columns are written as lowercase hex. Nulls become empty cells.
Why was my file refused for duplicate columns?
Because a CSV header cannot express two columns with the same name, and reading it anyway would keep only the last copy without saying so. The tool checks the Parquet schema, which still knows the truth, and refuses with the duplicated names listed, asking you to rename them in whatever wrote the file.
What if the file has no rows?
You still get a CSV with the header. The column names are read from the schema rather than from the first row, so a header only Parquet round trips back to a header only CSV instead of an empty file. The result line reports zero rows and the column count.
Is the file uploaded to be read?
No. The bytes are wrapped in memory and handed to the reader as an in-memory buffer, with no file or network access of any kind. Everything happens in your browser. Every row is materialised as an object before the CSV is written, so a large Parquet file can need several times its size in memory.