Open or paste a CSV file and select Download Parquet. By default every column is a nullable UTF-8 STRING, so IDs like 000917 keep their zeros, and empty cells become null. Choose Detect numbers and true/false to write INT64, DOUBLE and BOOLEAN columns where every value fits. The file is written in your browser by a JavaScript Parquet writer; nothing is uploaded.
How to convert CSV to Parquet
- Open a
.csv,.tsvor.txtfile, drop it on the tool, or paste rows. Check the table under Input; set the delimiter, header row or encoding under Import settings if needed. - Choose Value types, Compression, whether to Write empty text as null, and Rows per row group.
- Select Download Parquet and read the
.parquetfile with DuckDB, pandas, Polars, Spark or any other Parquet reader.
To convert many files with the same settings, choose Batch: convert several files. Each file becomes its own Parquet file and they download together as one ZIP. In a batch, each file must be 25 MB or smaller.
Schema and column types
Column names come from the header row exactly as written. A blank header becomes Column 3 and a repeated one becomes name (2), so every Parquet column has a unique name. Every column is optional (nullable).
| Keep every value as text | The default. Every column is BYTE_ARRAY annotated as UTF-8 string, holding each value byte for byte, including leading zeros, 1,5, N/A and date formats. |
|---|---|
| Whole numbers (with detection) | INT64 when every non-empty value is a whole number without leading zeros, from −9,007,199,254,740,991 to 9,007,199,254,740,991. Larger integers keep the column as text. |
| Decimals (with detection) | DOUBLE when every value is a plain decimal with at most 15 significant digits, so it survives the conversion. A column mixing 12 and 2.5 becomes DOUBLE. |
| true / false (with detection) | BOOLEAN when every value is true or false in any letter case. |
| Dates and timestamps | Stay STRING in both modes, for example 2026-03-01T08:00:00Z. Cast them in your query engine, such as CAST(reading_at AS TIMESTAMP) in DuckDB. |
In typed columns an empty cell is always null. In string columns, Write empty text as null (on by default) controls whether an empty cell becomes null or an empty string "".
Compression and row groups
| Snappy (fast, common default) | The default codec. Every common Parquet reader supports it. |
|---|---|
| Gzip (smaller) | Usually a smaller file than Snappy. Some lightweight readers don't include gzip support. |
| None | No compression, for debugging or for tools without a decompressor. |
| Rows per row group | Default 100,000, between 1,000 and 1,000,000. Because the browser workspace holds up to 100,000 rows, the default writes one row group; set a smaller value to get several row groups that readers can skip or read in parallel. |
The file also records the writer (hyparquet) and a created_by_app key in its metadata.
Troubleshooting
- A numeric column is a STRING. Either Keep every value as text is selected, or one value isn't a plain number, such as
1,234,12 kg,007or a 16-digit decimal. Find it with Analyze CSV or the CSV viewer. - IDs lost their leading zeros in another tool. This converter never makes a leading-zero column numeric. If the IDs changed, the CSV was probably opened and saved in a spreadsheet before conversion; check the source file in the CSV viewer.
- Everything is in one column. The delimiter was guessed wrong; choose it under Import settings.
- The file is too large for this tool. Parquet conversion works on files up to 25 MB, 100,000 rows, 250 columns and 2 million cells. Split the CSV and convert the parts, or compress the CSV with gzip if you only need a smaller download.
Limits and privacy
The CSV must open in the browser workspace: up to 25 MB, 100,000 rows, 250 columns and 2 million cells. The Parquet file is built in memory in one pass.
The writer is hyparquet-writer, a pure-JavaScript library loaded only when you convert; there is no WebAssembly or server step. It runs in a background worker in this tab, so the page stays responsive and Cancel stops it. The CSV is never sent to a server. For a queryable database file instead, use CSV to SQLite.
Example
Sensor readings with leading-zero IDs, ISO timestamps, empty cells and a quoted comma, converted with Detect numbers and true/false and the default Snappy compression, then read back with PyArrow. temp_c became DOUBLE and ok became BOOLEAN; sensor_id and reading_at stayed strings. With the default Keep every value as text, all five columns are string and ok keeps TRUE as written.
sensor_id,reading_at,temp_c,ok,site 000917,2026-03-01T08:00:00Z,21.5,true,Lab 2 000918,2026-03-01T08:05:00Z,,false, 000919,2026-03-01T08:10:00Z,-3,TRUE,"Roof, north"
schema:
sensor_id: string
reading_at: string
temp_c: double
ok: bool
site: string
rows: 3, row groups: 1, compression: SNAPPY
{'sensor_id': '000917', 'reading_at': '2026-03-01T08:00:00Z', 'temp_c': 21.5, 'ok': True, 'site': 'Lab 2'}
{'sensor_id': '000918', 'reading_at': '2026-03-01T08:05:00Z', 'temp_c': None, 'ok': False, 'site': None}
{'sensor_id': '000919', 'reading_at': '2026-03-01T08:10:00Z', 'temp_c': -3.0, 'ok': True, 'site': 'Roof, north'}Questions and answers
Is my CSV uploaded to convert it?
No. The Parquet file is written by a JavaScript library in a worker in your browser tab, and the download is created locally.
Why aren't dates written as Parquet DATE or TIMESTAMP?
CSV dates come in many formats and time zones, and guessing them silently can shift values. They are written as strings exactly as in the file; cast them in DuckDB, Spark or pandas, where you choose the format and zone.
Which compression should I choose?
Snappy works with practically every Parquet reader. Choose gzip when file size matters more and your reader supports it, and none only for debugging.