Warum DuckDB meine erste Wahl für die Datenverarbeitung ist
(robinlinacre.com)- DuckDB ist eine Open-Source-SQL-Engine, mit der sich große tabellarische Daten auf einer einzelnen Maschine schnell und einfach verarbeiten lassen, und wird in letzter Zeit im Data Engineering breit eingesetzt.
- Die Installation ist einfach, es gibt keine Abhängigkeiten, und die Engine lässt sich in einer Python-Umgebung sofort ausführen, wodurch sie sich gut für CI und Testautomatisierung eignet.
- Dank Optimierung für analytische Abfragen ist die Performance im Vergleich zu SQLite oder Postgres um bis zu das 1.000-Fache höher, und verschiedene Dateiformate (
csv,parquet,json) können direkt abgefragt werden. - Mit benutzerfreundlicher SQL-Syntax (
EXCLUDE,COLUMNS,QUALIFY, Function Chaining usw.) und einer Python-API lassen sich komplexe Pipelines effizient entwickeln. - Mit ACID-Konformität, Hochleistungs-UDFs und PostgreSQL-Integrations-Erweiterungen entwickelt sich DuckDB zu einer Lakehouse-Alternative für Daten im mittleren Maßstab.
Überblick über DuckDB
- DuckDB ist eine In-Process-SQL-Engine mit Fokus auf die Optimierung analytischer Abfragen.
- Sie läuft ohne separaten Server innerhalb der Anwendung und benötigt keinen externen Dienst wie Postgres.
- Sie ist auf umfangreiche Join- und Aggregationsoperationen spezialisiert und bietet im Vergleich zu transaktionsorientierten Engines (OLTP) eine 100- bis 1.000-fach höhere Performance.
- Ein zentraler Anwendungsfall ist die Batch-Verarbeitung großer Dateien wie
csv,parquetundjson, die direkt von der Festplatte eingelesen werden. - Sie kann auch für leichtgewichtige Datenexploration genutzt werden, etwa um CSV-Dateien einfach über die Kommandozeile abzufragen.
Hauptmerkmale
-
Geschwindigkeit
- DuckDB gehört zu den schnellsten Open-Source-Engines für Datenverarbeitung und liegt in Benchmarks regelmäßig weit vorne.
- Im Vergleich mit Polars, DataFusion, Spark und Dask ist DuckDB bei kleineren Datenmengen im Vorteil, während Spark und Dask bei sehr großen Datenmengen konkurrenzfähig sind.
-
Einfache Installation und keine Abhängigkeiten
- DuckDB wird als einzelne vorkompilierte Binärdatei bereitgestellt und kann in Python sofort mit
pip install duckdbinstalliert werden. - Durch die Abwesenheit von Abhängigkeiten ist die Installation im Vergleich zu großen Frameworks wie Spark sehr einfach.
- In Kombination mit
uvlässt sich eine Python-Umgebung in weniger als einer Sekunde einrichten.
- DuckDB wird als einzelne vorkompilierte Binärdatei bereitgestellt und kann in Python sofort mit
-
CI und Tests
- Dank schneller Startzeit und geringem Gewicht eignet sich DuckDB gut für CI- und Testumgebungen von Datenpipelines.
- Frühere Spark-basierte Tests waren langsam und komplex, während DuckDB die Umgebungskonfiguration vereinfacht und Konsistenz mit der Produktion leichter aufrechterhalten lässt.
-
Erfahrung beim Schreiben von SQL
- Mit DuckDB lassen sich SQL-Abfragen schnell schreiben und syntaktisch prüfen.
- Gegenüber dem lokalen Spark-Modus oder AWS Athena ist es für sofortige Ausführung und iterative Entwicklung vorteilhafter.
- Es bietet eine UI mit Autovervollständigung.
-
Benutzerfreundliche SQL-Syntax
- DuckDB enthält zahlreiche benutzerfreundliche SQL-Erweiterungen.
- Unterstützt werden u. a.
EXCLUDE,COLUMNS,QUALIFY, Modifikatoren für Window-Function-Aggregationen und Function Chaining (first_name.lower().trim()).
- Unterstützt werden u. a.
- Diese Funktionen machen komplexe Auswahl- und Transformationsaufgaben bei Spalten deutlich kompakter.
- DuckDB enthält zahlreiche benutzerfreundliche SQL-Erweiterungen.
-
Unterstützung für verschiedene Dateiformate
- Daten können direkt aus S3, Web-URLs und lokalen Dateien abgefragt werden.
- Beispiel: Ein entferntes Parquet-File lässt sich in der Form
read_parquet('https://.../flights.parquet')abfragen.
- Beispiel: Ein entferntes Parquet-File lässt sich in der Form
- Für CSV bietet DuckDB Optionen zur strengen Typbehandlung, um Fehler durch unstrukturierte Eingabedaten zu vermeiden.
- Daten können direkt aus S3, Web-URLs und lokalen Dateien abgefragt werden.
-
Python-API
- In Python lassen sich CTE-basierte Pipelines schrittweise definieren, und die Daten jedes Schritts können leicht überprüft werden.
- Über Aufrufe von
duckdb.sql()kann SQL in Kettenform verbunden werden. - Dank Lazy Execution lassen sich Zwischenergebnisse ohne Performance-Verlust prüfen.
- Über Aufrufe von
- Funktionen pro Schritt können getestet werden, was die Effizienz von CI-Tests verbessert.
- In Python lassen sich CTE-basierte Pipelines schrittweise definieren, und die Daten jedes Schritts können leicht überprüft werden.
-
ACID-Konformität
- DuckDB bietet vollständige ACID-Garantien, auch bei der Arbeit mit großen Datenmengen.
- Dadurch kann es als Alternative im mittleren Maßstab zu Lakehouse-Formaten wie Iceberg und Delta Lake genutzt werden.
-
Hochleistungs-UDFs und Community-Erweiterungen
- Benutzerdefinierte Funktionen (UDFs) mit hoher Performance können in C++ geschrieben werden.
- Über Community Extensions lassen sich Erweiterungen sofort mit Befehlen wie
INSTALL h3 FROM communityinstallieren.- Beispiel: Unterstützung für hexagonale Indizierung (h3) für Geodaten.
-
Dokumentation
- Die gesamte Dokumentation wird als eine einzelne Markdown-Datei bereitgestellt, was sich gut für LLM-Training oder die Suche im Code-Editor eignet.
- Mit Code-Folding lassen sich nur die benötigten Abschnitte leicht kopieren.
Praktische Nutzung und Wirkung
- Im Open-Source-Projekt Splink führte die Einführung von DuckDB als Standard-Backend zu folgenden Ergebnissen:
- Weniger Nutzerprobleme, höhere Arbeitsgeschwindigkeit sowie vereinfachte Feature-Entwicklung und Tests
Bemerkenswerte Erweiterungen
- PostgreSQL Extension: Postgres-Datenbanken können direkt aus DuckDB verbunden und abgefragt werden.
- pg_duckdb: Bettet die DuckDB-Engine in Postgres ein, sodass Transaktions- und Analyseverarbeitung parallel möglich sind.
- Künftig besteht nach Optimierungen bei Postgres-Indizes und Verbesserungen beim Filter Push-up das Potenzial für breite Verbreitung.
2 Kommentare
Es ist schon ironisch,
parqfür verteilte Verarbeitung mit dem Ziel einzusetzen, es auf einer einzelnen Maschine zu verarbeiten.Hacker-News-Kommentare
Es gibt viele Gründe, warum ich DuckDB mag
Es unterstützt
.parquet-,.json- und.csv-Dateien, und mitselect * from 'tsa20*.csv'sind Glob-Reads möglich, sodass sich Hunderte von Dateien wie eine einzige behandeln lassenSelbst bei unterschiedlichem Schema lassen sie sich mit
union_by_nameleicht zusammenführen, und der CSV-Parser weist Typen automatisch zuverlässig zuDie WebAssembly-Version ist 2 MB groß, die CLI 16 MB, also sehr klein
Dadurch kann man es direkt in Produkte einbetten. Zum Beispiel wie bei Malloy
Malloy ist so etwas wie eine technische Version von PowerBI oder Tableau und nutzt semantische Modelle, damit KI bessere Queries schreiben kann. Es fühlt sich an, als würde SQL 10-mal einfacher werden
Früher habe ich viel Zeit darauf verwendet, zuerst das Schema zu verstehen, heute lade ich die Daten, schreibe explorative Queries, überprüfe Annahmen und wiederhole dann den Prozess aus Bereinigung, Transformation und Tabellenerstellung
So kann ich viel schneller tief einsteigen und Sackgassen früh erkennen, was Zeitverschwendung reduziert
Ich habe gehört, dass es ein Paper über die Funktionsweise des CSV-Parsers und mögliche zukünftige Verbesserungen gibt, habe es aber noch nicht gefunden
Vor allem die Parquet- und JSON-Ingestion ist praktisch, und
clickhouse-localähnelt dem Konzept, DuckDB einzubettenMit
SELECT ... FROM s3Cluster(...)ist Wildcard-Ingestion aus S3-Buckets möglich, verteilt über die Cluster-Knotenschema_inference_modewird anscheinend ebenfalls unterstütztClickHouse hat auch eine Funktion ähnlich
union_by_nameumgesetztRelevante Doku: s3Cluster-Funktion, Schema Inference, PR #55892
Shaper verwendet allerdings SQL statt einer eigenen Sprache
Auf Basis von DuckDB lassen sich Dashboards nur mit SQL bauen
Shaper GitHub
Die Geschwindigkeit ist erstaunlich, und die automatische Schemaerkennung funktioniert meistens korrekt
Ein LLM erzeugt aus natürlichsprachlichen Anfragen das richtige SQL
Ich habe früher SQLite mit manuellem Import verwendet, aber mit DuckDB ist alles viel einfacher geworden
Ich nutze DuckDB ebenfalls sehr gern
Ich arbeite mit Wissenschaftlern zusammen, die die Küstenumwelt von British Columbia erforschen, und wir verarbeiten riesige Datenmengen, von Gletscherbeobachtungen bis zu Tiefsee-Drohnendaten
Wir haben DuckDB als Engine für ein neues Transformationswerkzeug für Biodiversitätsdaten gewählt; Ziel ist es, Daten in den Darwin-Core-Standard zu transformieren und zu validieren
Wir erzeugen DuckDB-Tabellen dynamisch anhand von Schemata und importieren die Daten. Bei Fehlern wird zeilenweise der Grund ausgegeben
Transformation und Validierung laufen ebenfalls komplett innerhalb von DuckDB
Dadurch konnten wir eine viel schnellere, leistungsfähigere und sogar im Browser ausführbare Anwendung bauen
Feldforscher können sie offline im iPad-Browser verwenden
Mit DuckDB habe ich das Vertrauen, dass SQL die harte Arbeit übernimmt
Fehlende Typsicherheit gleichen wir durch Parsing und Tests aus
Ziel des Projekts ist es, Wissenschaftlern zu ermöglichen, Biodiversitäts- und Genomikdaten mit gemeinsamen Werkzeugen zu analysieren und in öffentlichen Repositorien zu veröffentlichen
Ich arbeite in der wissenschaftlichen Datenverarbeitung häufig mit HDF5, aber DuckDB unterstützt HDF5 nicht nativ
Die vorhandene Erweiterung war langsam und funktional eingeschränkt, daher habe ich mit C++-Templates eine neue Erweiterung gebaut
Ich suche Leute mit Interesse an einer Zusammenarbeit
Persönlich finde ich die Syntax von Polars viel angenehmer als SQL und frage mich, ob sich DuckDB für mich lohnt
Wir verwenden DuckDB für die Analyse und Feed-Verarbeitung bei Bluesky
Um Ergebnisse schnell zu erhalten, nutzen wir das Apache-Arrow-Interface und erzeugen mit SQG direkt Code aus DuckDB-SQL-Queries
Ich möchte das Java-Projekt manifold-sql vorstellen
Damit lässt sich DuckDB-SQL typsicher inline schreiben
Man kann SQL direkt in den Code einbetten und mit
.fetch()über die Ergebnisse iterieren, was ohne Zwischenschicht sehr sauber istDie Aussagen des Autors sind für grundlegende Datenverarbeitung plausibel,
aber der Teil „Die meisten Tabellendaten lassen sich auf einer einzelnen Maschine verarbeiten“ ist diskussionswürdig
Bei Skalierung, Pivoting oder Anreicherung von Daten läuft man schnell in Out-of-Memory (OOM)
Auch die Aussage „SQL sollte die erste Wahl für modernes Data Engineering sein“ passt nicht gut zu komplexeren Analysen
Dataframe-APIs wie Polars oder pandas haben ebenfalls viele Vorteile, aber das Ökosystem ist nicht standardisiert, weshalb man Pipelines oft neu schreiben muss
Die meisten Daten liegen unter 10 GB, daher lassen sie sich auf einer einzelnen Maschine gut verarbeiten
Spark wird oft übertrieben eingesetzt
Mein Standpunkt ist: „Probier es zuerst mit DuckDB.“ In einfachen Fällen ist es schnell und effizient
Für einfache Pipeline-Verarbeitung ist SQL gut, aber Lesbarkeit ist subjektiv
Ich persönlich finde die Dataframe-Seite deutlich leichter lesbar
Beim Thema Ingestion wird viel Python oder Scala verwendet, aber SQL wird nicht verschwinden
OOM scheint nur in Extremfällen ein Problem zu sein
So viel Aufmerksamkeit DuckDB auch bekommt, Polars wird gleichzeitig unterschätzt
Ich mache viel Datenverarbeitung und nutze hauptsächlich Polars
Es ist sehr schnell und bietet wie pandas viele Funktionen, die sich in SQL nur schwer ausdrücken lassen
Man kann auch direkt Python-Funktionen verwenden
Selbst wenn DuckDB bei der Performance gleichauf wäre, zögere ich wegen der Ausdrucksbeschränkungen von SQL
Es ist eigenständig, einfach zu installieren und erfordert kaum Tuning oder Lernaufwand
Ich habe mit DuckDB eine schlecht formatierte Excel-Datei geladen, die von einem Mainframe erzeugt wurde,
und mit der Option
all_varcharwar sie in weniger als einer Sekunde geladenExcel selbst ist noch dabei, die Datei zu öffnen
DuckDB ist hervorragend, aber dynamisches Laden von Extensions kollidiert mit Code-Signing und macht den Einsatz in kommerziellen Apps schwierig
Außerdem verwendet die Spatial-Extension LGPL-Komponenten, was Lizenzfragen aufwirft
Es wäre gut, wenn man wie bei Apache Arrow nur die benötigten Funktionen paketweise kombinieren könnte
Zum Beispiel: GB/s-Array-Übertragung per HTTP mit Arrow Flight, Dateifreigabe mit Arrow IPC, Parquet-Lesen als separates Trait
DuckDBs SQL-Typsystem unterscheidet sich von Arrow, was zu Typinkompatibilitäten führen kann
Arrow stellt für die meisten Sprachen native Bibliotheken bereit
Ich frage mich, ob man bei einer einzelnen Tabelle mit mehreren Milliarden Transaktionsdaten und 30 Spalten
Seiten, die mit WHERE-Bedingungen gefiltert sind, schnell abrufen kann
In Postgres dauert selbst ein einfaches count(*) lange
Langsam wurde es bei mir nur bei komplexen Joins oder beim Glob-Verarbeiten vieler Dateien
Wenn die WHERE-Bedingungen einfache Spalte-Wert-Paare sind, sollte das ziemlich schnell gehen
DuckDB ist nicht einfach nur eine schnelle DB, sondern bietet auch eine hervorragende Developer Experience (devx)
Der Einstieg ist leicht, wodurch das Ökosystem schnell wächst
Auch die Web-/WASM-Integration ist beeindruckend
Ich hoffe, dass mehr solcher kleinen Engines auftauchen und Wettbewerb sowie Innovation weiter antreiben