- pg_lake ist eine Erweiterung, die auf Postgres basiert und Iceberg-Tabellen sowie Data-Lake-Dateien direkt integriert, um Transaktionen und schnelle Abfragen zu unterstützen
- Parquet-, CSV-, JSON- und Iceberg-Dateien in Objektspeichern wie S3 können direkt abgefragt, importiert und exportiert werden
- Nutzt intern die DuckDB Query Engine, um in der Postgres-Umgebung eine hohe Ausführungsgeschwindigkeit zu erreichen
- Bietet Lakehouse-Funktionen wie das Erstellen von Iceberg-Tabellen, automatische Schema-Inferenz für externe Dateien und S3-Ein-/Ausgabe über den COPY-Befehl über eine einzige SQL-Schnittstelle
- Nach der Übernahme von Crunchy Data durch Snowflake im Jahr 2025 als Open Source veröffentlicht und dient als Grundlage für die Erweiterung der Data-Lake-Integration im Postgres-Ökosystem
Überblick über pg_lake
- pg_lake ist eine Erweiterung zur Integration von Iceberg- und Data-Lake-Dateien in Postgres, wodurch sich Postgres als eigenständiges Lakehouse-System nutzen lässt
- Gewährleistet Transaktionen für Iceberg-Tabellen und unterstützt schnelle Abfragen
- Ermöglicht direkten Zugriff auf Rohdatendateien in Objektspeichern wie S3
- Hauptfunktionen
- Iceberg-Tabellen erstellen und ändern sowie von anderen Engines aus abfragen
- Datendateien in den Formaten Parquet, CSV, JSON und Iceberg abfragen und importieren
- Abfrageergebnisse per COPY-Befehl in den Formaten Parquet, CSV und JSON in Objektspeicher exportieren
- Geodatenformate wie GeoJSON und Shapefile lesen, die von GDAL unterstützt werden
- Stellt einen integrierten
map-Typ für semistrukturierte Daten bereit
- Kann heap, Iceberg und externe Dateien in einer einzigen SQL-Abfrage kombinieren
- Automatische Inferenz von Spalten und Typen aus externen Datenquellen
- Hohe Ausführungsgeschwindigkeit durch die DuckDB-Engine
Installation und Konfiguration
Anwendungsbeispiele
- Iceberg-Tabelle erstellen
CREATE TABLE iceberg_test USING iceberg AS
SELECT i as key, 'val_'|| i as val FROM generate_series(0,99)i;
- Nach dem Erstellen liefert
SELECT count(*) FROM iceberg_test; den Wert 100
- Der Speicherort der Iceberg-Metadaten kann überprüft werden
- COPY-Ein-/Ausgabe nach S3
COPY (SELECT * FROM iceberg_test) TO 's3://.../iceberg_test.parquet';
COPY iceberg_test FROM 's3://.../iceberg_test.parquet';
- Unterstützt die Formate Parquet, CSV und JSON
- S3-Dateien als externe Tabelle erstellen
CREATE FOREIGN TABLE parquet_table()
SERVER pg_lake
OPTIONS (path 's3://.../*.parquet');
- Automatische Spalteninferenz und abfragbar (
SELECT count(*) FROM parquet_table; → 100)
Architektur
- Komponenten
- PostgreSQL + pg_lake-Erweiterung
- pgduck_server (führt DuckDB aus und implementiert das Postgres-Protokoll)
- Funktionsweise
- Nutzer verbinden sich mit Postgres und führen SQL aus
- Teile der Abfragen werden über DuckDB parallel und spaltenorientiert ausgeführt
- DuckDB wird nicht in den Postgres-Prozess eingebettet, wodurch Probleme mit Thread- und Speichersicherheit vermieden werden
- Direkter Zugriff auf die DuckDB-Engine über Standard-Postgres-Clients möglich
Detaillierte Komponentenliste
- pg_lake_iceberg: Implementierung der Iceberg-Spezifikation
- pg_lake_table: Implementierung eines FDW für Dateien in Objektspeichern
- pg_lake_copy: Unterstützt COPY-Ein-/Ausgabe für Data Lakes
- pg_lake_engine: Gemeinsames Modul
- pg_extension_base: Basiskomponente für andere Erweiterungen
- pg_extension_updater: Funktion zur automatischen Aktualisierung von Erweiterungen
- pg_lake_benchmark: Führt Benchmarks für Lake-Tabellen aus
- pg_map: Generator für einen generalisierten
map-Typ
- pgduck_server: Server, der DuckDB lädt und über das Postgres-Protokoll bereitstellt
- duckdb_pglake: Fügt DuckDB Postgres-kompatible Funktionen hinzu
Entwicklungs- und Veröffentlichungshistorie
- Anfang 2024 begann Crunchy Data mit der Entwicklung, um Iceberg in Postgres einzuführen
- Anfangs lag der Fokus auf der DuckDB-Integration und der Bereitstellung von Funktionen für Crunchy-Bridge-Kunden
- Später wurden das Iceberg-v2-Protokoll und Transaktionsunterstützung implementiert
- Im November 2024 als Crunchy Data Warehouse neu veröffentlicht
- Im Juni 2025 übernahm Snowflake Crunchy Data, im November 2025 wurde pg_lake als Open Source veröffentlicht
- Die erste Version ist 3.0 (einschließlich der beiden vorherigen Generationen)
- Für bestehende Nutzer von Crunchy Data Warehouse wird ein automatischer Upgrade-Pfad bereitgestellt
Lizenz und Abhängigkeiten
- Apache-2.0-Lizenz
- Abhängig von den Projekten Apache Avro und DuckDB
- Beim Build werden Patches auf Avro und DuckDB-Erweiterungen angewendet
1 Kommentare
Hacker-News-Kommentare
Damit ließe sich die Komplexität reduzieren. Man braucht nur DuckDB und PostgreSQL (
pg_duckdb)Zur Referenz gibt es auch den Vortrag von Prof. Hannes Mühleisen: DuckLake - The SQL-Powered Lakehouse Format for the Rest of Us
pg_lakeüberhaupt erst dank DuckDB möglich gewordenDuckLake kann Dinge, die das Iceberg-basierte
pg_lakenicht kann, und umgekehrt kann Postgres Dinge, die DuckDB nicht kann. Zum Beispiel mehr als 100.000 Single-Row-Inserts pro Sekunde verarbeitenTransaktionsverarbeitung ist nicht gratis. Wenn man statt der Engine im Katalog den Katalog in die Engine packt, werden Transaktionen zwischen analytischen und operativen Tabellen möglich
Postgres fühlt sich auch in Bezug auf Persistenz und kontinuierliche Verarbeitung natürlicher an. Mit
pg_cronund PL/pgSQL kann man Orchestrierung aufbauenAußerdem ist Iceberg stark bei der Interoperabilität mit mehreren Query-Engines
pg catalogwarf DuckLake bei selbst erzeugten Dateien manchmal HTTP-400-FehlerIch bin nicht sicher, ob das an meinem Schreibmuster lag (Einfügen aus einem Polars-DataFrame in eine DuckLake-Tabelle) oder an der Struktur partitionierter Tabellen
In Entwicklungs-/Testumgebungen war es okay, aber teamweit war es schwierig. Deshalb bin ich am Ende wieder bei einer Kombination aus Hive-partitionierten Parquet-Dateien und DuckDB-Views gelandet
Ich plane später ein Beispiel als Issue zu posten, aber im Moment fehlt mir wegen anderer Dinge die Zeit
Früher sagte man im Postgres-Markt oft, es gebe kein „Open-Source-Snowflake“
Die Postgres-Erweiterung von Crunchy ist derzeit die fortschrittlichste Lösung auf dem Markt. Glückwunsch an Snowflake und das Crunchy-Team zur Open-Source-Veröffentlichung
Unter Linux kann man Systemeinstellungen über das Dateisystem lesen und schreiben (
cat /sys/...,echo ... > /sys/...)Mit FUSE kann man Dateisystemtreiber direkt im User Space implementieren. Man kann zum Beispiel SSH oder Google Drive mounten und dann mit dem
cp-Befehl kopierenAllerdings eignen sich Dateisysteme nur für hierarchische Daten. Die meisten Daten der realen Welt haben eine relationale Struktur
Data Lakes erlauben es, über die elegante Abstraktion von SQL unterschiedliche Datenquellen wie eine einzige relationale Datenbank zu behandeln
Da viele Anwendungen letztlich CRUD-zentriert sind, ist so ein Ansatz deutlich effizienter
In solchen Fällen hat Postgres Grenzen. Man braucht mehr CPU und RAM und am Ende eine verteilte Engine
Compute fragt Postgres: „Was sind die aktuellen Daten zu diesen Schlüsseln?“ oder „Wie sahen die Daten vor zwei Wochen aus?“, und die eigentlichen Analyseabfragen laufen direkt auf den Parquet-Dateien
Es ist schön, dass man das lokal mit Docker ausführen kann, aber es wäre gut, wenn man es auf AWS betreiben könnte, mit integrierter Abrechnung über ein Snowflake-Konto
pg_lakenützlichMan kann Parquet-Daten in Postgres einlesen und abfragen und sie auch mit bestehenden Tabellen joinen
(1) Gibt es Pläne für Kompatibilität mit der DuckLake-Spezifikation statt Iceberg? DuckLake verwaltet den Katalog über SQL-Tabellen statt über Dateien, was gleichzeitige Schreibvorgänge und Snapshot-Verwaltung vereinfacht
(2) Könnte
pg_duckdbmit der Zeit auf dieselbe Funktionalität hinauslaufen?Es gibt allerdings Komplexität, etwa bei der Verarbeitung von Inlinedaten. Wenn wir das lösen, können wir hohe Transaktionsleistung erreichen
(2) Für
pg_duckdbist es leichter, die DuckLake-Implementierung wiederzuverwenden, aber in Bezug auf Ressourcenverwaltung und Stabilität halte ich diese Struktur für weniger geeignetMan kann ETL-Jobs per CLI, YAML und Python ausführen