Truncated last lines are common and are skipped
Log files that were copied mid-write often end with a partial record. That line is skipped and counted in the warnings, so you know it happened.
JSON Lines is what logs, event streams and exports look like on the way out of a system. Parquet is what they should look like before anyone queries them. This converter reads the file line by line and writes a typed, compressed columnar file.
Reading JSONL
Auto-detect reads the first rows and picks the separator that splits them consistently.
Turn off when the file starts straight into data. Columns are then named column_1, column_2, and so on.
Turns "42" into a number and "true" into a boolean. Values with leading zeros stay text so IDs and zip codes survive.
Which worksheet to convert. Filled in once the workbook is read.
Dotted path to the array of records, such as data.items. Leave empty to use the whole document.
Turns {"user":{"id":7}} into a user.id column. Arrays are kept as JSON text.
Pick the encoding the file was written in. Wrong encoding shows up as garbled accents.
Comma-separated words that should become null instead of text.
Writing Parquet
Snappy is the default across Spark, DuckDB and pandas. Gzip is smaller but slower to read.
Turns a user.id column back into {"user":{"id":7}}.
Excel needs a byte order mark to open UTF-8 files with accents correctly.
Rows per row group. Larger groups compress better; smaller groups let readers skip more.
conversion-preroll
This short ad is what keeps the converter free.
One JSON object per line, built for streaming and appending. Typed, compressed, columnar storage built for analytical scans.
| JSONL | Parquet | |
|---|---|---|
| Type information | Strings, numbers, booleans, null | Full — ints, floats, booleans, timestamps, decimals |
| Structure | One nested object per line | Columnar, with nested type support |
| Compression | None | Built in (Snappy, Gzip, Zstd) |
| Typical file size | Slightly under JSON | Typically 5–15% of the CSV |
| Schema | Implicit, per line | Stored in the file footer |
| Human-readable | Yes, one record at a time | No — binary |
| Tool support | Log pipelines, LLM training sets, BigQuery | Spark, DuckDB, pandas, BigQuery, Athena |
Log files that were copied mid-write often end with a partial record. That line is skipped and counted in the warnings, so you know it happened.
Event streams gain fields over time. Because columns are the union of all keys, old records simply get nulls for the newer fields — which is usually what you want, but it does explain a wide result.
Structured log records nested five or six levels deep produce long dotted column names. Setting a record path or pre-filtering the fields you need keeps the output manageable.
A day of JSONL logs converted to Parquet can be queried with DuckDB in seconds instead of scanned line by line.
JSONL is the standard interchange format for datasets; Parquet is far more efficient once you are filtering and sampling repeatedly.
BigQuery, Athena and Snowflake all ingest Parquet more cheaply than raw JSON, because they scan less data.
sticky-bottomYour file is downloading
post-conversion