https://duckdb.org/2025/09/17/ducklake-03.html
吉列尔莫·桑切斯、加博尔·萨尼亚斯
2025-09-17 · 4 分钟
TL;DR:我们正在发布 DuckLake 规范的 0.3 版本和 ducklake DuckDB 扩展。
过去两个月,该团队的重点是使 DuckLake 尽可能强大。 除此之外,我们还实现了一系列功能,使运行 DuckLake 的体验更加流畅。 在这篇文章中,我们将讨论 DuckDB 扩展和 DuckLake v0.3 规范中的更新。ducklake
ducklake 扩展中的新功能
DuckDB v1.4.0 中的扩展提供了几个新功能。要试用本博文中描述的功能,请确保您安装了 DuckDB v1.4.0 并且所有扩展都是最新的。这可以通过运行以下命令来实现:ducklake
UPDATE EXTENSIONS;
与 Iceberg 的互作性
在 DuckDB 扩展的支持下,可以在 DuckLake 之间将数据复制到 Iceberg。iceberg
Iceberg 和 DuckLake 的设置
现在您可以从 Iceberg 复制到 DuckLake。
CREATE SCHEMA iceberg_datalake.default;
CREATE TABLE iceberg_datalake.default.iceberg_table AS
SELECT a FROM range(4) t(a);
COPY FROM DATABASE iceberg_datalake TO ducklake;
从 DuckLake 复制到 Iceberg 也可以,因为模式已经在 Iceberg 中创建。
-- Assuming Iceberg catalog is empty since the COPY command does
-- not replace tables
CREATE SCHEMA iceberg_datalake.main;
CREATE TABLE ducklake.default.ducklake_table AS
SELECT a FROM range(4) t(a);
COPY FROM DATABASE ducklake TO iceberg_datalake;
这些示例是最新快照的数据副本(即深度副本),这意味着只有数据从 Iceberg 移植到 DuckLake,反之亦然。从 Iceberg 到 DuckLake 也支持仅元数据副本。主要区别在于,仅元数据副本不会复制基础数据,而只复制元数据,包括所有快照历史记录。这意味着您可以像查询 DuckLake 表一样查询 Iceberg 表的先前快照。
CREATE SCHEMA iceberg_datalake.default;
CREATE TABLE iceberg_datalake.default.iceberg_table AS
SELECT a FROM range(4) t(a); -- version 0
INSERT INTO iceberg_datalake.default.iceberg_table
SELECT a FROM range(4, 10) t(a); -- version 1
CALL iceberg_to_ducklake('iceberg_datalake', 'ducklake');
现在,您可以像查询 DuckLake 表一样查询任何版本的冰山表。
FROM ducklake.default.iceberg_table AT (VERSION => 0);
┌───────┐
│ a │
│ int64 │
├───────┤
│ 0 │
│ 1 │
│ 2 │
│ 3 │
└───────┘
MERGE INTO 语句
由于 DuckDB 1.4 支持此功能,因此从此版本开始也可以在扩展中使用。这是不支持主键但仍希望支持更新插入(即加号)功能的 OLAP 系统中非常常见的语句。MERGE INTO ducklake UPDATE INSERT
CREATE TABLE Stock(item_id INTEGER, balance INTEGER);
INSERT INTO Stock VALUES (10, 2200), (20, 1900);
WITH new_stocks(item_id, volume) AS (VALUES (20, 2200), (30, 1900))
MERGE INTO Stock USING new_stocks USING (item_id)
WHEN MATCHED THEN UPDATE SET balance = balance + volume
WHEN NOT MATCHED THEN INSERT VALUES (new_stocks.item_id, new_stocks.volume);
FROM Stock;
┌─────────┬─────────┐
│ item_id │ balance │
│ int32 │ int32 │
├─────────┼─────────┤
│ 10 │ 2200 │
│ 20 │ 4100 │
│ 30 │ 1900 │
└─────────┴─────────┘
MERGE INTO还支持更复杂的条件和语句。DELETE
WITH deletes(item_id, delete_threshold) AS (VALUES (10, 3000))
MERGE INTO Stock USING deletes USING (item_id)
WHEN MATCHED AND balance < delete_threshold THEN DELETE;
FROM Stock;
┌─────────┬─────────┐
│ item_id │ balance │
│ int32 │ int32 │
├─────────┼─────────┤
│ 20 │ 4100 │
│ 30 │ 1900 │
└─────────┴─────────┘
CHECKPOINT 语句
DuckLake 现在还支持 CHECKPOINT 语句。在 DuckLake 中,此语句按顺序运行一系列维护函数。这包括刷新内联数据、过期快照、压缩文件、重写大量删除的文件以及清理旧文件或孤立文件。该语句可以通过一些全局选项进行配置,这些选项可以通过该函数进行设置。CHECKPOINT ducklake .set_option
ATTACH 'ducklake:my_ducklake.ducklake' AS my_ducklake;
USE my_ducklake;
CHECKPOINT;
更快的插入
如果某个查询中每个线程的输出具有所需的大小(即不太小),则设置该选项很可能会加快 DuckLake 中的插入过程。如果您有大量线程并且每个线程的输出不是很重要,则使用 可能不会提高性能,并且会生成大量不受欢迎的小文件,从而阻碍读取性能。如果您运行的设置是 DuckDB 位于 EC2 实例中,并且具有非常高的网络带宽(高达 100 Gbps)以写入 S3,则可以从此选项中受益匪浅。per_thread_output per_thread_output
在以下基准测试中,我们确实发现启用时提高了 ~25% :per_thread_output
.timer on
ATTACH 'ducklake:my_ducklake.ducklake' AS ducklake;
CREATE TABLE sample_table AS SELECT * FROM range(1_000_000_000);
-- 4.5 seconds
CREATE TABLE slow_copy AS SELECT * FROM sample_table;
-- enable the option
CALL ducklake.set_option('per_thread_output', true);
-- 3.4 seconds
CREATE TABLE fast_copy AS SELECT * FROM sample_table;
此功能由社区成员 Julian Meyers 贡献。
DuckLake 规范中的更新
对几何类型的支持
DuckLake 现在支持几何类型。这意味着您现在可以使用 DuckDB 扩展中的大部分功能,并将 DuckLake 作为后端。请参阅有关支持的几何原语的文档。spatial
INSTALL spatial;
LOAD spatial;
ATTACH 'ducklake:my_ducklake.ducklake' AS ducklake;
CREATE TABLE geometry_table (polygons GEOMETRY);
INSERT INTO geometry_table VALUES ('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))');
SELECT
polygons,
ST_Area(polygons) AS area
FROM geometry_table;
┌─────────────────────────────────────┬────────┐
│ polygons │ area │
│ geometry │ double │
├─────────────────────────────────────┼────────┤
│ POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0)) │ 1.0 │
└─────────────────────────────────────┴────────┘
请注意,几何支持目前处于实验阶段,缺少过滤器下推、数据内联和坐标系跟踪等功能。
作者提交
我们还启用了一些功能,以便在您在 DuckLake 中执行新事务时能够创作提交。此功能极大地有助于满足审计需求。
从 v0.2 迁移到 v0.3
您不必担心在不同版本的 DuckLake 规范之间手动迁移。 在安装了新扩展的情况下附加到现有 DuckLake 时,扩展将使用以下 SQL 脚本将元数据目录更新到 0.3 版本。ducklake
单击此处查看扩展用于从 DuckLake v0.2 迁移到 v0.3 的 SQL 脚本。ducklake
ALTER TABLE ducklake_name_mapping ADD COLUMN IF NOT EXISTS is_partition BOOLEAN DEFAULT false;
ALTER TABLE ducklake_snapshot_changes ADD COLUMN IF NOT EXISTS author VARCHAR DEFAULT NULL;
ALTER TABLE ducklake_snapshot_changes ADD COLUMN IF NOT EXISTS commit_message VARCHAR DEFAULT NULL;
ALTER TABLE ducklake_snapshot_changes ADD COLUMN IF NOT EXISTS commit_extra_info VARCHAR DEFAULT NULL;
UPDATE ducklake_metadata SET value = '0.3' WHERE key = 'version';
CREATE TABLE IF NOT EXISTS ducklake_schema_versions(begin_snapshot BIGINT, schema_version BIGINT);
INSERT INTO ducklake_schema_versions SELECT * FROM (SELECT MIN(snapshot_id), schema_version FROM ducklake_snapshot GROUP BY schema_version ORDER BY schema_version) t WHERE NOT EXISTS (SELECT 1 FROM ducklake_schema_versions);
ALTER TABLE IF EXISTS ducklake_file_column_statistics RENAME TO ducklake_file_column_stats;
ALTER TABLE ducklake_file_column_stats ADD COLUMN IF NOT EXISTS extra_stats VARCHAR DEFAULT NULL;
ALTER TABLE ducklake_table_column_stats ADD COLUMN IF NOT EXISTS extra_stats VARCHAR DEFAULT NULL;
指南和路线图
在上个月,我们还准备了一些指南来帮助您采用 DuckLake,并涵盖一些不是 DuckLake 功能但可以帮助您顺利运行 DuckLake 的主题。
不同格式之间的迁移
备份和恢复
存取控制
最后,我们还发布了一个路线图,显示了即将推出的 DuckLake 版本中计划的功能。
DuckLake 0.3 新特性解析
2978

被折叠的 条评论
为什么被折叠?



