Parquet Profiler
Eine browserbasierte Anwendung zur strukturellen und statistischen Analyse von
Parquet-Dateien. Die Verarbeitung erfolgt vollständig lokal im Browser
über DuckDB-WASM — es findet keine Datenübertragung an einen Server statt.
Dateien werden standardmäßig referenziert statt komplett geladen:
DuckDB liest nur die tatsächlich benötigten Bytebereiche, sodass auch mehrere große
Dateien speicherschonend bleiben.
Workflow
- Eine oder mehrere Parquet-Dateien per Drag & Drop oder Dateiauswahl laden.
Bei mehreren Dateien wird die markierte Datei profiliert; ein Klick wechselt die aktive Datei.
-
Die Datei-Metadaten (Zeilen, Spalten, Row Groups, Kompression,
Erzeuger) werden sofort aus dem Parquet-Footer ermittelt und angezeigt —
ohne dass die eigentlichen Daten gescannt werden müssen.
-
Vier Tabs bieten unterschiedliche Sichten auf den Datensatz:
Attribute (Profiling der einzelnen Spalten),
Daten-Vorschau (zeilenweise Anzeige mit Filter & Paginierung),
Pivot (Excel-Style Auswertung) und SQL
(freier SQL-Editor mit DuckDB-Backend).
Klick auf einen Tab wechselt instant die Ansicht, der State bleibt erhalten.
Attribute
Die Statistiken pro Attribut beziehen sich immer auf den gesamten Datensatz
— unabhängig von Filtern, die in der Daten-Vorschau gesetzt sind. So bleibt die
Attribut-Übersicht als Profiling-Werkzeug stabil und vergleichbar.
In der Zeile jedes Attributs werden bereits ohne Aufklappen einige Werte
direkt aus dem Parquet-Footer angezeigt — Null-Anteil, Wertebereich
(Min/Max), Anzahl eindeutiger Werte und Speichergröße auf der Platte inkl.
Kompressionsrate. Die meisten dieser Werte sind exakt und kosten keinen
Datenscan; sie sind auch bei mehreren GB großen Dateien in Millisekunden verfügbar.
Falls der Writer keine Statistiken in den Footer geschrieben hat, bleiben die Felder
leer (—).
Die Spalte Eindeutig zeigt die Anzahl verschiedener Werte pro Attribut.
Diese Information steht im Parquet-Footer in der Regel nicht zur Verfügung, daher
wird sie nach dem Laden im Hintergrund über eine einzelne Sammelquery berechnet
(ein gemeinsamer Scan über alle Attribute). Bis die Berechnung abgeschlossen ist,
zeigt die Zelle pulsende Punkte (…).
Die Attribut-Tabelle ist sortierbar (Klick auf den Spaltenkopf, tri-state:
asc → desc → aus) und filterbar via Filter-Icon im Spaltenkopf
(Excel-Style: Werteliste, Bereichs-Filter oder Volltext-Suche, je nach Datenart).
Filter wirken nur auf die Attribut-Tabelle und beeinflussen die Statistiken nicht.
-
Numerisch (
INTEGER, DOUBLE,
DECIMAL …): Min, Max, Mittelwert, Standardabweichung, Median,
Quartile, Histogramm mit ca. 30 Bins.
-
String (
VARCHAR): Anzahl eindeutiger Werte,
Min-/Max-Länge, durchschnittliche Länge, Top-20-Werte als sortierte Liste
(Rang, Wert, relativer Balken, Anzahl, Anteil an Non-NULL).
-
Datum/Zeit (
DATE, TIMESTAMP):
Zeitspanne, Verteilung als Zeitreihen-Histogramm (automatische Granularität:
Stunde/Tag/Monat/Jahr).
-
Boolean: Verteilung über
TRUE / FALSE /
NULL als Doughnut-Chart.
- Für alle Typen: Anzahl Zeilen, Non-Null-Werte und Null-Anteil.
Daten-Vorschau, Filter & Paginierung
Über das Filter-Icon im Spaltenkopf der Vorschau-Tabelle lassen sich
Excel-Style-Filter setzen. Numerische und Datums-Spalten bieten
einen Bereichs-Filter (Min/Max), kategorische Spalten (String,
Boolean) eine durchsuchbare Werteliste mit Checkboxen. Filter sind
kombinierbar (UND-Verknüpfung); aktive Filter erscheinen als Chips oberhalb der
Tabelle und sind einzeln entfernbar.
Die Tabelle wird seitenweise geladen (25, 50, 100 oder 500 Zeilen pro Seite) —
auch bei großen Dateien bleibt das Blättern flüssig, da pro Seite nur ein
LIMIT … OFFSET ausgeführt wird.
Pivot
Excel-Style Pivot-Auswertung. Drei Zonen analog zu Excel:
Zeilen (Gruppierungs-Dimensionen, mehrere möglich),
Spalten (eine Spalten-Dimension, optional, spreizt das Ergebnis in
die Breite) und Werte (eine oder mehrere Aggregationen, z.B.
Anzahl, Summe, Mittelwert, Min, Max,
Anzahl Eindeutig).
Die Aggregation läuft als GROUP BY-Query in DuckDB; bei gesetzter
Spalten-Dimension wird das Ergebnis in JavaScript in die 2D-Matrix-Form gebracht.
Damit lassen sich die Spaltenwerte auf die Top 100
begrenzen, ohne dass eine hohe Kardinalität die Tabelle unbedienbar macht. Bei
Überschreitung wird eine Warnung mit Anzahl der ausgeblendeten Werte angezeigt.
Die Ergebnis-Tabelle ist sortierbar — Klick auf eine Spaltenüberschrift schaltet
durch aufsteigend → absteigend → Original-Reihenfolge.
SQL
Freier SQL-Editor mit der vollen Power von DuckDB. Jede geladene Datei ist als
eigener View verfügbar (Name aus dem Dateinamen abgeleitet); data
verweist immer auf die aktuell aktive Datei. So sind auch Joins über mehrere
Dateien hinweg möglich. Beispiele:
SELECT * FROM data LIMIT 100
DESCRIBE data — Schema der aktiven Datei
SUMMARIZE data — Statistik-Übersicht aller Spalten in einer Query
SELECT a.*, b.* FROM datei_a a JOIN datei_b b ON a.id = b.id — Join über zwei Dateien
PIVOT data ON col USING COUNT(*) GROUP BY row — native DuckDB-Pivot-Syntax
Tastenkürzel: Strg/⌘+Enter führt die Query aus,
Tab fügt zwei Leerzeichen ein. Das Dropdown Beispiel lädt
vorgefertigte Snippets in den Editor.
Die Anzeige ist auf 10.000 Zeilen begrenzt — die Query selbst
läuft komplett, aber das Rendering der Tabelle würde sonst den Browser blockieren.
Bei mehr Treffern erscheint eine Warnung mit der vollen Anzahl. Für ein gefiltertes
Voll-Ergebnis bitte die Query selbst mit LIMIT oder WHERE
einschränken.
Performance-Hinweise
-
Datei-Metadaten kommen aus dem Parquet-Footer und sind in Millisekunden verfügbar
— auch bei Multi-GB-Dateien.
-
Spaltenstatistiken erfordern einen tatsächlichen Scan und können bei großen
Dateien einige Sekunden dauern. Sie werden gecacht und müssen nur einmal pro
Spalte und Datei berechnet werden.
-
Filter wirken nur auf die Daten-Vorschau und werden direkt als
WHERE-Klausel in der SQL-Abfrage umgesetzt. Spaltenstatistiken werden
durch Filter nicht ungültig.
-
Dateien werden per Bytebereich referenziert, ihre Größe ist also nicht der
begrenzende Faktor. Nur die aktive Datei lässt sich optional in den Speicher
laden (Aktive Datei in den Speicher laden) — schneller bei wiederholten
Abfragen, dafür mit RAM-Bedarf. DuckDB-WASM arbeitet in einem 32-Bit-Speicher
(ca. 2–4 GB), in den das Puffern passen muss.
Technologie
- DuckDB-WASM — In-Browser-SQL-Engine mit nativer Parquet-Unterstützung.
- Chart.js
@4.4.1 — Visualisierungen.
-
Beide Bibliotheken werden via CDN geladen — bei der ersten Nutzung wird daher
eine Internetverbindung benötigt. Anschließend cached der Browser die Bundles.
Parquet Profiler
A browser-based tool for the structural and statistical analysis of Parquet files.
Everything runs locally in the browser through DuckDB-WASM —
no data is sent to a server. Files are referenced rather than loaded
by default: DuckDB reads only the byte ranges it actually needs, so even several large
files stay memory-friendly.
Workflow
- Load one or more Parquet files by drag & drop or through the file picker.
With several files the selected one is profiled; a click switches the active file.
-
The file metadata (rows, columns, row groups, compression, writer)
is read straight from the Parquet footer and shown immediately — without
scanning the actual data.
-
Four tabs offer different views of the data set:
Columns (profiling of the individual columns),
Data preview (row-wise display with filters & paging),
Pivot (Excel-style analysis) and SQL
(a free SQL editor on the DuckDB backend).
Clicking a tab switches the view instantly and keeps its state.
Columns
The statistics per column always cover the whole data set —
regardless of any filters set in the data preview. That keeps the column overview
stable and comparable as a profiling tool.
Each column's row already shows several values without expanding it, taken straight
from the Parquet footer — null share, value range (min/max),
number of distinct values and the size on disk including the compression ratio. Most
of these are exact and cost no data scan; they are available in milliseconds
even for files of several gigabytes. If the writer stored no statistics in the footer,
the fields stay empty (—).
The Distinct column shows the number of different values per column.
Parquet footers usually do not carry that information, so it is computed in the
background after loading, with a single combined query (one shared scan across all
columns). Until it finishes, the cell shows pulsing dots (…).
The column table is sortable (click a header, tri-state:
asc → desc → off) and filterable through the filter icon in
the header (Excel-style: value list, range filter or full-text search, depending on the
kind of data). Filters affect the column table only and do not change the statistics.
-
Numeric (
INTEGER, DOUBLE,
DECIMAL …): min, max, mean, standard deviation, median,
quartiles, histogram with about 30 bins.
-
String (
VARCHAR): number of distinct values,
min/max length, average length, top 20 values as a sorted list
(rank, value, relative bar, count, share of non-NULL).
-
Date/time (
DATE, TIMESTAMP):
time span, distribution as a time-series histogram (granularity chosen
automatically: hour/day/month/year).
-
Boolean: distribution over
TRUE / FALSE /
NULL as a doughnut chart.
- For every type: number of rows, non-null values and null share.
Data preview, filters & paging
The filter icon in the preview table's column header sets
Excel-style filters. Numeric and date columns offer a
range filter (min/max), categorical columns (string, boolean) a
searchable value list with checkboxes. Filters combine (AND); active
filters appear as chips above the table and can be removed individually.
The table is loaded page by page (25, 50, 100 or 500 rows per page) — paging
stays fluid even on large files, because each page runs a single
LIMIT … OFFSET.
Pivot
Excel-style pivot analysis. Three zones, as in Excel:
Rows (grouping dimensions, several possible),
Columns (one column dimension, optional, spreads the result
sideways) and Values (one or more aggregations, e.g.
count, sum, average, min, max,
distinct count).
The aggregation runs as a GROUP BY query in DuckDB; with a column
dimension set, the result is reshaped into a 2D matrix in JavaScript. The column
values are limited to the top 100, so high cardinality cannot make
the table unusable. If more exist, a warning reports how many were hidden.
The result table is sortable — clicking a header cycles through ascending
→ descending → original order.
SQL
A free SQL editor with the full power of DuckDB. Every loaded file is available as its
own view (named after the file); data always refers to the currently
active file. Joins across several files are therefore possible. Examples:
SELECT * FROM data LIMIT 100
DESCRIBE data — schema of the active file
SUMMARIZE data — statistics for all columns in one query
SELECT a.*, b.* FROM file_a a JOIN file_b b ON a.id = b.id — join across two files
PIVOT data ON col USING COUNT(*) GROUP BY row — native DuckDB pivot syntax
Shortcuts: Ctrl/⌘+Enter runs the query,
Tab inserts two spaces. The Example dropdown loads ready-made
snippets into the editor.
The display is capped at 10,000 rows — the query itself runs in
full, but rendering the table would otherwise block the browser. With more matches a
warning shows the full count. For a filtered complete result, narrow the query itself
with LIMIT or WHERE.
Performance notes
-
File metadata comes from the Parquet footer and is available in milliseconds
— even for multi-GB files.
-
Column statistics require an actual scan and can take a few seconds on large files.
They are cached and computed only once per column and file.
-
Filters affect the data preview only and are translated directly into a
WHERE clause in the SQL query. They do not invalidate column
statistics.
-
Files are referenced by byte range, so their size is not the limiting factor. Only
the active file can optionally be buffered into memory
(Load the active file into memory) — faster for repeated queries, at the
cost of RAM. DuckDB-WASM runs in a 32-bit heap (about 2–4 GB), which is what
buffering has to fit into.
Technology
- DuckDB-WASM — in-browser SQL engine with native Parquet support.
- Chart.js
@4.4.1 — visualisations.
-
Both libraries are loaded from a CDN — an internet connection is therefore
needed on first use. The browser caches the bundles afterwards.