Dit artikel introduceert de DuckLake-extensie voor DuckDB, waarmee gebruikers kunnen werken met DuckLake, een open Lakehouse-formaat gebaseerd op SQL en Parquet-bestanden.
De belangrijkste punten uit het artikel zijn:
- Installatie en Gebruik: De extensie kan eenvoudig worden geïnstalleerd via SQL-commando's. Door gebruik te maken van de
ATTACH-syntaxis kunnen databases worden gekoppeld, waarna standaard SQL kan worden gebruikt voor data-manipulatie.
- Geavanceerde Functionaliteiten: Het artikel demonstreert krachtige features zoals:
- Time Travel: Het opvragen van data van een specifieke versie.
- Schema-evolutie: Het toevoegen van kolommen aan bestaande tabellen.
- Change Data Feed: Het inzien van specifieke wijzigingen in de data.
- Ontwikkeling en Testen: Er wordt gedetailleerde informatie gegeven over het bouwen van de extensie vanuit de broncode via
make en het uitvoeren van uitgebreide tests met verschillende backend-configuraties, waaronder PostgreSQL en SQLite.
DuckDB DuckLake Extensie
Voor meer informatie kun je de website van DuckLake bezoeken.
Installatie
DuckLake kan worden geïnstalleerd met het INSTALL-commando:
INSTALL ducklake;
De nieuwste ontwikkelversie kan worden geïnstalleerd via core_nightly:
FORCE INSTALL ducklake FROM core_nightly;
Gebruik
DuckLake-databases kunnen worden gekoppeld via de ATTACH-syntaxis. Daarna kunnen tabellen worden gemaakt, gewijzigd en opgevraagd met standaard SQL.
Hieronder volgt een kort gebruiksvoorbeeld waarbij de metadata wordt opgeslagen in een DuckDB-databasebestand genaamd metadata.ducklake, en de data in Parquet-bestanden in de map file_path/:
ATTACH 'ducklake:metadata.ducklake' AS my_ducklake (DATA_PATH 'file_path/');
USE my_ducklake;
CREATE TABLE my_ducklake.my_table(id INTEGER, val VARCHAR);
INSERT INTO my_ducklake.my_table VALUES (1, 'Hello'), (2, 'World');
FROM my_ducklake.my_table;
Resultaat:
| id (int32) | val (varchar) |
| 1 | Hello |
| 2 | World |
Updates
UPDATE my_ducklake.my_table SET val='DuckLake' WHERE id=2;
FROM my_ducklake.my_table;
Resultaat:
| id (int32) | val (varchar) |
| 1 | Hello |
| 2 | DuckLake |
Time Travel
FROM my_ducklake.my_table AT (VERSION => 2);
Resultaat:
| id (int32) | val (varchar) |
| 1 | Hello |
| 2 | World |
Schema-evolutie
ALTER TABLE my_ducklake.my_table ADD COLUMN new_column VARCHAR;
FROM my_ducklake.my_table;
Resultaat:
| id (int32) | val (varchar) | new_column (varchar) |
| 1 | Hello | NULL |
| 2 | DuckLake | NULL |
Change Data Feed
FROM my_ducklake.table_changes('my_table', 2, 2);
Resultaat:
| snapshot_id (int64) | rowid (int64) | change_type (varchar) | id (int32) | val (varchar) |
| 2 | 0 | insert | 1 | Hello |
| 2 | 1 | insert | 2 | World |
Voor meer informatie kun je de gebruiksgids raadplegen.
Bouwen en laden van de extensie
Om de extensie te bouwen, voer je de volgende commando's uit:
git submodule init
git submodule update --recursive
# Om te bouwen met meerdere cores, gebruik: `make GEN=ninja release`
make
De submodules zijn gekoppeld aan de DuckDB-versie in .github/duckdb-version, wat ook de versie is waarop de CI (Continuous Integration) bouwt. Het commando make pull verplaatst ze naar het uiteinde van hun branch, waardoor de build kan mislukken.
Om de extensie uit te voeren, start je de gebundelde duckdb-shell:
./build/release/duckdb
Bijdragen
Externe bijdragen aan de DuckLake-extensie zijn welkom. De actieve ontwikkelbranch is momenteel main; alle bijdragen dienen op deze branch gericht te zijn.
Testen
Hieronder staan de commando's voor het uitvoeren van verschillende tests:
- Alle DuckLake-extensietests uitvoeren:
``bash ./build/release/test/unittest ``
- Een enkel testbestand uitvoeren:
``bash ./build/release/test/unittest test/sql/transaction/create_conflict.test ``
- Tests uitvoeren die aan een specifiek patroon voldoen:
``bash ./build/release/test/unittest "test/sql/partitioning/*" ``
- DuckDB-core tests uitvoeren met DuckLake als storage backend:
``bash ./build/release/test/unittest --test-config test/configs/attach_ducklake.json --test-dir duckdb ``
- DuckLake-tests uitvoeren met PostgreSQL als catalogusdatabase (vereist een draaiende PostgreSQL-instantie):
``bash ./build/release/test/unittest --test-config test/configs/postgres.json ``
- DuckLake-tests uitvoeren met SQLite als catalogusdatabase:
``bash ./build/release/test/unittest --test-config test/configs/sqlite.json ``
- Tests uitvoeren met 'deletion vectors' ingeschakeld:
``bash ./build/release/test/unittest --test-config test/configs/deletion_vectors.json ``
DuckDB DuckLake Extensie
Voor meer informatie kun je de website van DuckLake bezoeken.
Installatie
DuckLake kan worden geïnstalleerd met het INSTALL-commando:
INSTALL ducklake;
De nieuwste ontwikkelversie kan worden geïnstalleerd via core_nightly:
FORCE INSTALL ducklake FROM core_nightly;
Gebruik
DuckLake-databases kunnen worden gekoppeld via de ATTACH-syntaxis. Daarna kunnen tabellen worden gemaakt, gewijzigd en opgevraagd met standaard SQL.
Hieronder volgt een kort gebruiksvoorbeeld waarbij de metadata wordt opgeslagen in een DuckDB-databasebestand genaamd metadata.ducklake, en de data in Parquet-bestanden in de map file_path/:
ATTACH 'ducklake:metadata.ducklake' AS my_ducklake (DATA_PATH 'file_path/');
USE my_ducklake;
CREATE TABLE my_ducklake.my_table(id INTEGER, val VARCHAR);
INSERT INTO my_ducklake.my_table VALUES (1, 'Hello'), (2, 'World');
FROM my_ducklake.my_table;
Resultaat:
| id (int32) | val (varchar) |
| 1 | Hello |
| 2 | World |
Updates
UPDATE my_ducklake.my_table SET val='DuckLake' WHERE id=2;
FROM my_ducklake.my_table;
Resultaat:
| id (int32) | val (varchar) |
| 1 | Hello |
| 2 | DuckLake |
Time Travel
FROM my_ducklake.my_table AT (VERSION => 2);
Resultaat:
| id (int32) | val (varchar) |
| 1 | Hello |
| 2 | World |
Schema-evolutie
ALTER TABLE my_ducklake.my_table ADD COLUMN new_column VARCHAR;
FROM my_ducklake.my_table;
Resultaat:
| id (int32) | val (varchar) | new_column (varchar) |
| 1 | Hello | NULL |
| 2 | DuckLake | NULL |
Change Data Feed
FROM my_ducklake.table_changes('my_table', 2, 2);
Resultaat:
| snapshot_id (int64) | rowid (int64) | change_type (varchar) | id (int32) | val (varchar) |
| 2 | 0 | insert | 1 | Hello |
| 2 | 1 | insert | 2 | World |
Voor meer informatie kun je de gebruiksgids raadplegen.
Bouwen en laden van de extensie
Om de extensie te bouwen, voer je de volgende commando's uit:
git submodule init
git submodule update --recursive
# Om te bouwen met meerdere cores, gebruik: `make GEN=ninja release`
make
De submodules zijn gekoppeld aan de DuckDB-versie in .github/duckdb-version, wat ook de versie is waarop de CI (Continuous Integration) bouwt. Het commando make pull verplaatst ze naar het uiteinde van hun branch, waardoor de build kan mislukken.
Om de extensie uit te voeren, start je de gebundelde duckdb-shell:
./build/release/duckdb
Bijdragen
Externe bijdragen aan de DuckLake-extensie zijn welkom. De actieve ontwikkelbranch is momenteel main; alle bijdragen dienen op deze branch gericht te zijn.
Testen
Hieronder staan de commando's voor het uitvoeren van verschillende tests:
- Alle DuckLake-extensietests uitvoeren:
``bash ./build/release/test/unittest ``
- Een enkel testbestand uitvoeren:
``bash ./build/release/test/unittest test/sql/transaction/create_conflict.test ``
- Tests uitvoeren die aan een specifiek patroon voldoen:
``bash ./build/release/test/unittest "test/sql/partitioning/*" ``
- DuckDB-core tests uitvoeren met DuckLake als storage backend:
``bash ./build/release/test/unittest --test-config test/configs/attach_ducklake.json --test-dir duckdb ``
- DuckLake-tests uitvoeren met PostgreSQL als catalogusdatabase (vereist een draaiende PostgreSQL-instantie):
``bash ./build/release/test/unittest --test-config test/configs/postgres.json ``
- DuckLake-tests uitvoeren met SQLite als catalogusdatabase:
``bash ./build/release/test/unittest --test-config test/configs/sqlite.json ``
- Tests uitvoeren met 'deletion vectors' ingeschakeld:
``bash ./build/release/test/unittest --test-config test/configs/deletion_vectors.json ``