转载:DuckLake 0.3 具有 Iceberg 互作性和几何支持

DuckLake 0.3 新特性解析

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 版本中计划的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值