JSONL vs Parquet: Das richtige Datenformat wählen
Ein umfassender Vergleich von JSONL (JSON Lines) und Apache Parquet. Verstehen Sie die Kompromisse bei Komprimierung, Abfrageleistung, Schema-Durchsetzung und Ökosystem-Unterstützung, um das richtige Format für Ihre Daten-Workloads zu wählen.
Letzte Aktualisierung: Februar 2026
Was ist JSONL?
JSONL (JSON Lines) ist ein textbasiertes Datenformat, bei dem jede Zeile ein einzelnes, eigenständiges JSON-Objekt enthält, getrennt durch Zeilenumbrüche. Es ist eine natürliche Erweiterung des allgegenwärtigen JSON-Formats, speziell für Streaming- und Log-ähnliche Daten konzipiert. Da jede Zeile ein unabhängiges JSON-Dokument ist, können Dateien angehängt werden, ohne bestehende Daten umzuschreiben, und sie können Zeile für Zeile mit minimalem Speicher-Overhead verarbeitet werden.
JSONL ist zum Standard-Austauschformat für Machine-Learning-Trainingsdaten (OpenAI-Fine-Tuning, Hugging Face-Datensätze), Anwendungsprotokolle, Event-Streams und jedes Szenario geworden, in dem Daten inkrementell eintreffen. Durch seine menschenlesbare Natur lässt es sich leicht mit jedem Texteditor oder Kommandozeilen-Tool wie grep, head und jq inspizieren.
{"id": 1, "name": "Alice", "role": "engineer", "salary": 95000}{"id": 2, "name": "Bob", "role": "designer", "salary": 88000}{"id": 3, "name": "Charlie", "role": "manager", "salary": 105000}
Was ist Parquet?
Apache Parquet ist ein spaltenorientiertes Binärspeicherformat, das für effiziente analytische Abfragen auf großen Datensätzen konzipiert wurde. Anstatt Daten zeilenweise wie JSONL zu speichern, organisiert Parquet Werte nach Spalten, was bedeutet, dass das Lesen eines einzelnen Feldes über Millionen von Zeilen nur die relevante Spalte scannen muss, anstatt jeden vollständigen Datensatz. Dieses spaltenorientierte Layout ermöglicht aggressive Komprimierung, da Werte innerhalb einer Spalte tendenziell ähnlich in Typ und Verteilung sind.
Parquet wurde im Apache-Hadoop-Ökosystem erstellt und ist heute das De-facto-Speicherformat für Data Lakes auf AWS S3, Google Cloud Storage und Azure Blob Storage. Es ist tief integriert mit Apache Spark, Apache Hive, Presto, DuckDB, Snowflake, BigQuery und praktisch jeder modernen Analyse-Engine. Parquet-Dateien betten ein striktes Schema in ihre Metadaten ein, sodass Verbraucher immer die genauen Typen und die Struktur der Daten kennen, ohne externe Dokumentation zu benötigen.
import pyarrow.parquet as pqimport pandas as pd# DataFrame als Parquet schreibendf = pd.DataFrame({'id': [1, 2, 3],'name': ['Alice', 'Bob', 'Charlie'],'role': ['engineer', 'designer', 'manager'],'salary': [95000, 88000, 105000]})df.to_parquet('employees.parquet')# Bestimmte Spalten lesen (spaltenorientierter Vorteil)df = pq.read_table('employees.parquet', columns=['name', 'salary']).to_pandas()
JSONL vs Parquet: Vergleich nebeneinander
Die folgende Tabelle fasst die wesentlichen Unterschiede zwischen JSONL und Parquet in den Dimensionen zusammen, die bei der Wahl eines Datenformats für Ihr Projekt am wichtigsten sind.
| Eigenschaft | JSONL | Parquet |
|---|---|---|
| Datenlayout | Zeilenorientiert, textbasiert. Jede Zeile ist ein vollständiges JSON-Objekt. | Spaltenorientiert, binär. Werte werden nach Spalten mit Zeilengruppen gespeichert. |
| Kodierung | UTF-8-Klartext. Menschenlesbar, in jedem Texteditor bearbeitbar. | Binär mit Dictionary-, RLE- und Bit-Packing-Kodierung. Nicht menschenlesbar. |
| Komprimierung | Optionale externe Komprimierung (gzip, zstd). Feldnamen in jeder Zeile wiederholt. | Integrierte spaltenweise Komprimierung (Snappy, Zstd, Gzip). 2-10x kleinere Dateien. |
| Abfrageleistung | Muss die gesamte Datei für jede Abfrage scannen. Kein Column Pruning oder Predicate Pushdown. | Column Pruning und Predicate Pushdown überspringen irrelevante Daten. Um Größenordnungen schneller für analytische Abfragen. |
| Schema | Schemafrei. Jede Zeile kann unterschiedliche Felder und Typen haben. Flexibel aber fehleranfällig. | Striktes typisiertes Schema in Dateimetadaten eingebettet. Beim Lesen und Schreiben durchgesetzt. |
| Streaming / Anhängen | Ausgezeichnet. Eine neue Zeile ans Ende der Datei anhängen. Ideal für Echtzeit-Aufnahme. | Schlecht. Erfordert Neuschreiben oder Erstellen neuer Dateipartitionen zum Hinzufügen von Daten. |
| Menschenlesbar | Ja. Inspektion mit cat, head, grep, jq oder jedem Texteditor. | Nein. Erfordert spezialisierte Tools (parquet-tools, PyArrow, DuckDB) zur Inspektion. |
| Ökosystem | Universell. Von jeder Programmiersprache mit JSON-Parser unterstützt. | Analyse-fokussiert. Tiefe Integration mit Spark, Hive, Presto, DuckDB, Snowflake, BigQuery. |
Leistungsbenchmarks
Der Leistungsunterschied zwischen JSONL und Parquet wird im großen Maßstab dramatisch. Nachfolgend sind repräsentative Benchmarks für einen Datensatz mit 10 Millionen Zeilen und 20 Spalten (eine Mischung aus Strings, Ganzzahlen, Gleitkommazahlen und Zeitstempeln).
Dateigröße (Komprimierung)
Vollständiger Tabellenscan
Schreibgeschwindigkeit
Einzelspaltenabfrage
Benchmarks gemessen mit Python (pandas + PyArrow) auf einem M2 MacBook Pro mit 16 GB RAM. Reale Ergebnisse variieren je nach Hardware, Datenverteilung und Komprimierungscodec.
Wann JSONL vs Parquet verwenden
- Echtzeit-Log-Aufnahme und Event-Streaming
- ML-Trainingsdaten für OpenAI, Anthropic und Hugging Face
- Datenaustausch zwischen Microservices und APIs
- Semi-strukturierte Daten mit unterschiedlichen Schemas pro Datensatz
- Schnelles Prototyping und Debugging, wo menschliche Lesbarkeit wichtig ist
- Append-only-Daten, bei denen Datensätze kontinuierlich eintreffen
- Kleine bis mittlere Datensätze (unter 1 GB), die keine analytischen Abfragen benötigen
- Data-Lake-Speicherung auf S3, GCS oder Azure Blob
- Analytische Abfragen mit Spark, Presto, DuckDB oder Snowflake
- Spaltenweise Aggregationen (SUM, AVG, COUNT) über Milliarden von Zeilen
- Strikte Schema-Durchsetzung und Data-Governance-Anforderungen
- Langzeitarchivierung, bei der Speicherkosten wichtig sind (2-10x kleinere Dateien)
- Feature Stores und ML-Feature-Pipelines, die bestimmte Spalten lesen
- Datensätze größer als 1 GB, bei denen Abfrageleistung kritisch ist
Hybride Architektur: JSONL-Aufnahme, Parquet-Speicherung
In Produktions-Datenplattformen schließen sich JSONL und Parquet nicht gegenseitig aus. Ein gängiges und effektives Muster ist die Verwendung von JSONL für die Datenaufnahme und Parquet für die Langzeitspeicherung und Analyse. Dieser hybride Ansatz kombiniert die Stärken beider Formate: JSONL's Einfachheit für Echtzeit-Datenerfassung und Parquet's Effizienz für nachgelagerte Abfragen.
Die Pipeline funktioniert in drei Stufen. Erstens werden Rohereignisse oder -datensätze als JSONL-Dateien angehängt, wenn sie eintreffen, da JSONL schnelle, sperrenfreie Anhängeoperationen unterstützt. Zweitens liest ein periodischer Batch-Job (stündlich, täglich oder durch Dateigröße ausgelöst) die angesammelten JSONL-Dateien, validiert und transformiert die Daten und konvertiert sie in das Parquet-Format. Drittens werden die resultierenden Parquet-Dateien in einem Data Lake gespeichert, partitioniert nach Datum, Region oder anderen Dimensionen für effizientes Abfragen.
1. Aufnahme als JSONL
Sammeln Sie Rohereignisse, Logs und API-Antworten als JSONL-Dateien. Schnelle Anhängeoperationen, kein Schema erforderlich, und einfaches Debugging in Echtzeit.
2. Transformieren & Validieren
Lesen Sie periodisch JSONL-Batches, wenden Sie Schema-Validierung an, bereinigen und normalisieren Sie Daten und behandeln Sie fehlerhafte Datensätze.
3. Speichern als Parquet
Schreiben Sie validierte Daten als partitionierte Parquet-Dateien in Ihren Data Lake. Abfragen mit Spark, DuckDB oder jeder Analyse-Engine.
import jsonimport pandas as pdimport pyarrow as paimport pyarrow.parquet as pqfrom pathlib import Pathfrom datetime import datetimedef jsonl_to_parquet(jsonl_dir: str, parquet_dir: str):"""Angesammelte JSONL-Dateien in partitioniertes Parquet konvertieren."""records = []for jsonl_file in Path(jsonl_dir).glob('*.jsonl'):with open(jsonl_file, 'r') as f:for line in f:line = line.strip()if line:records.append(json.loads(line))if not records:returndf = pd.DataFrame(records)# Partitionsspalte hinzufügendf['date'] = datetime.now().strftime('%Y-%m-%d')table = pa.Table.from_pandas(df)pq.write_to_dataset(table,root_path=parquet_dir,partition_cols=['date'],compression='zstd')print(f'Converted {len(records)} records to Parquet')jsonl_to_parquet('raw_events/', 'data_lake/')
Testen Sie unsere kostenlosen JSONL-Tools
Arbeiten Sie mit JSONL-Dateien? Verwenden Sie unsere kostenlosen browserbasierenden Tools, um JSONL-Daten sofort anzuzeigen, zu validieren und zu konvertieren. Keine Installation oder Uploads erforderlich.