Bei analytischen Datenbanken handelt es sich in der Regel um Applikationsungetüme. Systeme wie Snowflake, Redshift oder Postgres sind - selbst in ihrer Cloud-gehosteten Version - enorm einrichtungs- und wartungsintensiv. Für einzelne, kleinere Analytics-Tasks auf dem eigenen Desktop oder Laptop kommen solche Brummer einem Overkill gleich.
Anders verhält es sich mit DuckDB, einer leichtgewichtigen aber performanten Datenbank-Engine für Analysezwecke, die in Form einer simplen Executable ums Eck kommt und entweder Standalone oder als Bibliothek im Rahmen eines Host-Prozesses läuft. In Sachen Setup und Wartung gibt sich DuckDB ähnlich asketisch wie SQLite. Konzipiert ist das Tool für schnelle, spaltenorientierte Queries. Dabei setzt DuckDB auf allseits bekannte SQL-Syntax und unterstützt Bibliotheken für alle relevanten Programmiersprachen. Sie können also mit der Sprache Ihrer Wahl programmatisch arbeiten - oder auch das Command Line Interface nutzen (auch im Rahmen einer Shell-Pipeline).
Im Folgenden lesen Sie, wie Sie mit DuckDB arbeiten.
Daten in DuckDB einladen
Bei der Analysearbeit mit DuckDB stehen Ihnen zwei verschiedene Modi zur Verfügung:
Im Persistent Mode werden die Daten auf die Festplatte geschrieben, um Workloads zu stemmen, die den Systemspeicher übersteigen. Dieser Modus kostet Geschwindigkeit.
Im In-Memory Mode werden Datensätze vollständig im Speicher vorgehalten. Das sorgt für mehr Speed, allerdings ist nach Beendigung des Programms auch alles weg.
DuckDB kann Daten aus einer Vielzahl von Quellen einlesen, CSV, JSON und Apache Parquet sind dabei die gängigsten. Im Fall von CSV und JSON versucht DuckDB standardmäßig, Spalten und Datentypen selbst zu ermitteln. Dieser Prozess kann bei Bedarf jedoch außer Kraft gesetzt werden, beispielsweise, um ein Format für die Datumsspalte zu spezifizieren. Darüber hinaus können auch andere Datenbanken wie MySQL oder Postgres als Datenquellen für DuckDB verwendet werden. Das funktioniert über Extensions (dazu später mehr).
Um Daten aus einer externen Quelle in DuckDB zu laden, stehen Ihnen verschiedene Möglichkeiten zur Verfügung. Sie können einen SQL-String verwenden, der direkt an DuckDB übergeben wird:
SELECT * FROM read_csv('data.csv');
Darüber hinaus können Sie auch Methoden für bestimmte Programmiersprachen über die DuckDB Interface Library nutzen. Mit der Python-Bibliothek für DuckDB sieht das Daten-Ingesting etwa wie folgt aus:
import duckdb
duckdb.read_csv("data.csv")
Auch bestimmte Dateiformate wie beispielsweise Parquet direkt abzufragen, ist möglich:
SELECT * FROM 'test.parquet';
Um eine dauerhafte Datenansicht zu etablieren, die in Tabellenform für mehrere Queries verwendet werden, können Sie außerdem auf File Queries setzen:
CREATE VIEW test_data AS SELECT * FROM read_parquet('test.parquet');
Weil DuckDB für die Arbeit mit Parquet-Dateien optimiert ist, liest es nur die Bestandteile der Datei, die es braucht. Davon abgesehen können auch andere Interfaces wie ADBC oder ODBC verwendet werden. Letzteres dient als Konnektor für Datenvisualisierungs-Tools wie Tableau.
Wenn die in DuckDB importierten Daten exportiert werden sollen, ist das in diversen gängigen Dateiformaten möglich. Das macht DuckDB in Verarbeitungs-Pipelines auch zu einem nützlichen Datenkonvertierungs-Tool.
Daten abfragen mit DuckDB
Sobald Sie Daten in DuckDB eingeladen haben, können Sie sie mit Hilfe von SQL-Expressions abfragen. Das Format unterscheidet sich dabei nicht von "normalen" Abfragen:
SELECT * FROM users WHERE ID>1000 ORDER BY Name DESC LIMIT 5;
Wollen Sie für DuckDB-Queries eine Client-API nutzen, gibt es zwei Möglichkeiten: Sie können SQL-Strings über die API übergeben - oder die relationale Schnittstelle des Clients nutzen, um Datenabfragen programmatisch aufzubauen. Konkret könnte das in Python mit einer JSON-Datei wie folgt aussehen:
import duckdb
file = duckdb.read_json("users.json")
file.select("*").filter("ID>1000").order("Name").limit(5)
Im Fall von Python steht Ihnen außerdem auch die Option offen, die PySpark API zu nutzen, um DuckDB direkt abzufragen. Dabei ist anzumerken, dass die Implementierung (noch) nicht den vollen Funktionsumfang unterstützt.
Der SQL-Dialekt von DuckDB enthält zudem einige Analytics-bezogene Zusatzelemente. Wollen Sie beispielsweise nur eine Teilmenge von Daten innerhalb einer Tabelle abfragen, funktioniert das über die SAMPLE Clause. Die resultierende Abfrage läuft deutlich schneller, ist aber möglicherweise auch weniger akkurat. Darüber hinaus unterstützt DuckDB unter anderem auch:
das
PIVOT
-Keyword, um entsprechende Tabellen zu erstellen,Window-Funktionen sowie
QUALIFY
-Klauseln, um diese zu filtern.
DuckDB Extensions
Wie bereits erwähnt, ist DuckDB nicht auf die integrierten Datenformate und -verhaltensweisen beschränkt. Über die Extension API ist es auch möglich, verschiedene Addons einzubinden. Verfügbar sind zum Beispiel Extensions für:
Amazon Web Services
Apache Arrow
Apache Iceberg
Azure
Excel
JSON
MySQL
Parquet
Postgres
SQLite
Vector Similarity Search Queries
DuckDB is introducing support for vector similarity search through the new VSS extension.
— DuckDB (@duckdb) May 3, 2024
Read @Maxxen_'s blog post for a sneak preview on the new extension's capabilities: https://t.co/9qacS13wnm pic.twitter.com/rVaNcFkg1P
(fm)