Ist Ihnen DuckDB auch schon begegnet? In meinen Feeds ist diese Datenbank-Technologie schon länger ein vieldiskutiertes Thema. Der Titel sagt schon vieles: DuckDB ist ist ein relationales Datenbank-Managementsystem (DBMS) und verfügt über eine sehr performante Engine für analytische Anwendungsfälle. Meines Erachtens für Data Engineers und Data Scientists Grund genug, sich diese Technologie genauer anzuschauen.
Ich habe DuckDB das erste Mal vor einem Jahr (Anfang 2023) operativ eingesetzt. Ziel war damals, eine substanzielle Datenmenge (circa 250 GB, wenn ich mich richtig erinnere), die als CSV-Dateien angeliefert worden waren, Plausibilitätsprüfungen, Datenkorrekturen und vor allem einer Filterung und Datenmodell-Transformation zu unterziehen. DuckDB hat sich bei dieser erstmaligen Anwendung und seither sehr bewährt.
If it quacks like a duck… 🦆
Die wichtigsten Grundlagen vorweg: DuckDB unterstützt Windows-, Mac OS- und Linux-Systeme und sowohl x86- wie auch ARM-Chipsets. DuckDB und wichtige Erweiterungen von DuckDB sind Open-Source-Software unter der MIT-Lizenz. DuckDB hat keinerlei externe Abhängigkeiten und läuft in process (als Teil eines Host-Prozesses) oder als einzelne Binary. Wenn man eine DuckDB-Datenbank persistiert, resultiert eine Datei. Wie man sieht, teilt DuckDB also einige Eigenschaften mit dem weltweit meist-eingesetzten DBMS.
DuckDB stellt Client-APIs für diverse Programmiersprachen bereit, darunter Python, R, Java, Node.js, Julia, Rust, WebAssembly und noch einige weitere. C#-Support besteht auch, aber durch einen von Dritten beigesteuerten Wrapper. Daneben gibt es einen Standalone-Client für die Kommandozeile (CLI-Client). DuckDB unterstützt einen recht umfangreichen SQL-Dialekt. Es kann zudem diverse Dateiformate lesen und schreiben, darunter Parquet, JSON, CSV 🙄 oder Excel – sowohl im lokalen Dateisystem wie auch remote über HTTPS oder über S3 aus/in S3-Buckets.
DuckDB ist spezialisiert auf die sehr schnelle Ausführung von analytischen Abfragen auf Daten (OLAP-Anwendungsfälle, im Gegensatz zu auf Transaktionen spezialisierten OLTP-Datenbanken). DuckDB zieht nach eigenen Angaben seine grosse Performanz unter anderem aus vektorisierter Ausführung von Abfragen («vektorisiert» ist hier so zu verstehen wie im Kontext von Datenmutationen in Python/Pandas oder R).
Kurze Demo: Vorstösse im Thurgauer Grossen Rat
Das DuckDB-CLI-Tool ist einfach eine Binary, die man von der DuckDB-Website herunterladen kann. Für eine Kurz-Demonstration von DuckDB und des CLI-Tools habe ich für eine Fingerübung den Datensatz «Anzahl Vorstösse nach Mitglieder des Grossen Rates» des Kantons Thurgau genommen. Ich habe den Datensatz aus der Shell mit curl
heruntergeladen. Anschliessend starte ich den Client mit dem Befehl duckdb
. Es öffnet sich der DuckDB-Prompt, dem ein D
vorangestellt ist. Mit .open data.duckdb
(zum Beispiel) könnte ich die Datenbank auf der Harddisk persistieren (es entsteht eine einzelne Datei data.duckdb
). Im Beispiel tue ich das aber nicht und verwende daher eine in-memory-Datenbank:
Die heruntergeladene CSV-Datei kann mit read_csv_auto()
in eine Tabelle in unserer in-memory-Datenbank importiert werden. Der Beispiel-Code zeigt zuerst eine Kurzform (die sogenannte FROM
-first-Form, die der SQL-Dialekt von DuckDB ermöglicht). Anschliessend folgt eine gebräuchlichere, aber etwas längere Form des Imports. Die dritte Variante im folgenden Code-Beispiel nutzt implizit die DuckDB-Erweiterung httpfs
. Ich hätte diese explizit aktivieren können mit load httpfs;
(und davor einmalig Installieren mit install httpfs;
– siehe den Kommentar im Code-Beispiel). httpfs
ist eine sogenannte auto-loadable extension: Da ich read_csv_auto()
hier einen URL übergebe, erledigt DuckDB das Aktivieren von httpfs
automatisch für mich. Damit kann DuckDB das CSV direkt von der Website des Kantons Thurgau in die Datenbank laden:
Die resultierende Tabelle mit den durch den CSV-Parser abgeleiteten Datentypen kann anschliessend mittels DESCRIBE
geprüft werden:
Und natürlich können anschliessend SQL-Abfragen getätigt werden. Im Beispiel ermittle ich die Anzahl Vorstösse (pro Typ) pro Partei. Weil in den älteren Daten «Die Mitte» noch «CVP» hiess, setze ich zur Harmonisierung erst ein UPDATE
-Statement ab. Anschliessend erstelle ich eine neue Tabelle mit den relevanten Zahlen (DuckDB unterstützt hier die Syntax «SELECT * INTO tbl
» nicht).
Speziell: Da ich im nächsten Schritt die Daten nach Excel exportieren möchte, bin ich hier gezwungen, alle resultierenden Werte in den Datentyp BIGINT
zu casten. Das dürfte daran liegen, dass die Zahlen in der CSV-Datei wie oben abgebildet als Daten vom Typ BIGINT
aufgefasst worden sind. Nach der Summenbildung legt DuckDB den Datentyp HUGEINT
an. Dieser ist aber nicht kompatibel mit Excel bzw. dem Excel-Export. Darüber hinaus ist er eigentlich sowieso unnötig aufgebläht, aber in letzter Konsequenz wohl ein Artefakt des CSV-Imports.
Zuguterletzt exportiere ich die Tabelle aus einer der schnellsten in die populärste «Datenbank» 😉 der Welt. Nebenbei interessant: Der Excel-Export benötigt die DuckDB-Extension spatial
. Das liegt daran, dass er mittels gdal (einem Werkzeug aus dem Geodaten-Umfeld) bewerkstelligt wird. Anders als httpfs
oben, muss diese Extension explizit installiert und geladen werden. Anschliessend ist der Export nach Excel ein einfaches COPY
mit dem entsprechenden gdal-Treiber:
Das Resultat (mit manuell hinzugefügten Datenbalken) sieht dann wie folgt aus:
Fazit – was nun?
Ich werde auch künftig für gewisse Data Engineering- und Data Science-Aufgaben auf DuckDB setzen, gerne auch in Kombination mit Parquet für file-basierte Speicherung.
Ich habe es zwar noch nicht getestet – aber spannend könnte meines Erachtens auch sein, DuckDB für rechenintensive Abfragen und Analysen mit einer bewährten eher transaktions-orientierten Datenbank wie PostgreSQL zu kombinieren. Das funktioniert dank einer entsprechenden Extension so, dass DuckDB Inhalte in PostgreSQL direkt für Analysen erschliessen kann.
Und auch die Domäne räumlicher Daten lohnt sich wohl zu beobachten. Gute Einstiegspunkte zu diesem Thema sind die Ausführungen von DuckDB selbst (ich mag nur schon den schön gewählten Namen «PostGEESE») und die Tests von Kollege Stefan Ziegler im Intelris-Umfeld.
Haben Sie Data Engineering- oder Data Science-Herausforderungen, bei denen eine schnelle analytische Datenbank nützlich sein könnte? Oder wo das Problem etwas komplizierter ist und Sie eventuell froh um einen Austausch wären? Kontaktieren Sie mich unverbindlich.
Headerbild © rsm