Convert JSONL to Parquet — Free, Private, In-Browser
JSONL — also called NDJSON — is one JSON object per line, and it's the lingua franca of logs and event streams: append-friendly, streamable, but verbose untyped text that repeats every key on every line. Parquet is the opposite: columnar, strongly typed, compressed. DuckDB reads the file line-by-line with read_json_auto, infers a schema, and writes Parquet from it. The payoff is large — keys are stored once as column metadata instead of on every record, each column compresses on its own, and the file usually shrinks several times over. Scans get faster because engines read only the columns they need, and the schema now travels with the file, so DuckDB, Spark, Athena, and BigQuery stop re-guessing types. This is the classic logs-and-events-to-analytics step.
The thing to understand about JSONL is that lines don't have to share a shape. DuckDB samples records and unions everything it sees into one wide schema: a key present on some lines and missing from others becomes a nullable column, NULL wherever it's absent. Nested objects become STRUCT columns and arrays become LIST columns, so structure survives intact — a real advantage over flattening to CSV. The trap is mixed types: a field that's an integer on some lines and a string on others widens to a common type, usually VARCHAR, and event streams whose schema drifted over time produce exactly this. JSON has no date type either, so timestamp-looking strings land as VARCHAR unless you cast them. Eyeball the inferred schema before you trust it.
Because each line is independent, JSONL streams cleanly — DuckDB reads records without materializing one giant top-level array in memory, so it handles large log dumps more gracefully than array-wrapped JSON. The write is still bounded by your browser's memory, and remember DuckDB runs single-threaded here. Once written, the Parquet carries its schema plus per-column statistics, so predicate pushdown and column pruning work downstream, and every tool agrees on types instead of re-sniffing them. That typed, compressed file is exactly what you want landing in object storage or feeding an analytics engine. It all runs locally in your browser via DuckDB-WASM — your JSONL is never uploaded.
Drop a file or click to browse
Drop a JSONL file — processed locally, never uploaded
Frequently asked questions
- My lines don't all have the same keys — is that a problem?
- No. DuckDB unions every key it sees into one wide schema, and a key that's missing from a given line becomes NULL in that row. This is expected for evolving event streams. The one caveat: DuckDB infers from a sample, so a rare key that only appears deep in the file can be missed and dropped from the schema — bump the sample size or reorder if a column goes missing.
- A field is a number on some lines and a string on others — what does DuckDB do?
- It widens the mixed values to a common type across all lines, usually falling back to VARCHAR (or erroring if it can't reconcile them). Schema drift in logs — a field that was an integer, then later emitted as a quoted string — produces exactly this. Normalize the field upstream or expect a text column in the Parquet.
- How is this different from JSON to Parquet?
- JSONL/NDJSON is one object per line with no enclosing array or commas between records; plain JSON is a single top-level array or object. DuckDB reads JSONL line-by-line, which streams better for large log and event files, whereas a giant JSON array has to be parsed whole. The Parquet output is the same either way — this page just targets the newline-delimited form.
- Is my file uploaded anywhere?
- No. The JSONL→Parquet conversion runs entirely in your browser via DuckDB-WASM. Your file never leaves your device.
- How large a file can I convert?
- It's bounded by your browser's available memory rather than any server limit — files in the hundreds of MB are routine. DuckDB runs single-threaded here, so very large files just take a little longer.
- Do I need an account?
- No — it's free and requires no sign-up.
Do more with your JSONL file
- Parquet InspectorRead a Parquet file's schema, row groups, compression & column stats.
- Warehouse DDLGenerate Snowflake/BigQuery/Redshift CREATE TABLE & load commands.
- dbt generatorGenerate a dbt sources.yml, staging model & schema.yml from a schema.
- Data profilePer-column null %, distinct counts, min/max & median.