任何一家商业公司的产品都要变现,DuckDB的商业逻辑到底是什么样的?
DuckDB v1.3.1 内置了DuckLake插件, 从产品角度看, 这个插件到底有何深远用意?
1、DuckDB 通过embedding直入用户边缘计算, 就像毛细血管.
2、DuckLake 通过远端存储, 让用户的边缘端可直接接入数据湖存储, 就像主干道把边缘和云端进行了打通.
3、MotherDuck 在远端存储的基础之上, 再增加了远端(云端)计算能力, 给了用户一个新的选择: 你不说怕Move data慢嘛? 你不是怕本地算力不够嘛? 当你需要计算数据湖海量数据的时候有MotherDuck顶着.
DuckDB 是在做云边一体 !!!
边和开源抓流量,云做变现!这就是DuckDB的商业路径。
DuckDB v1.3.1 内置 DuckLake 插件升级到了 v0.2.
下面且看官方blog翻译如下: https://duckdb.org/2025/07/04/ducklake-02.html
TL;DR:我们发布了 DuckLake v0.2 标准,该标准由 DuckDB v1.3.1 的扩展支持ducklake。
一个多月前,我们发布了DuckLake ,社区的积极反馈让我们欣喜若狂。当然,我们也收到了大量的功能请求。随着 DuckLake 0.2 版本的发布,我们很高兴地向大家展示自发布以来所做的改进!
首先,我们想快速提醒一下:DuckLake一词既指DuckLake 开放标准,也指DuckDB ducklake扩展。在这篇博文中,我们将讨论影响这两者的相关更新。
DuckDB ducklake 扩展中的更新如下
现在可以使用 Secret 来管理 DuckLake 凭证。Secret 可以使用标准 Secret 基础架构创建,并包含连接到特定 DuckLake 实例所需的所有信息。连接到 DuckLake 时,可以将 Secret 名称作为参数传入。然后,连接信息将从 Secret 中加载。
您可以按如下方式将命名密钥传递给 DuckLake:
CREATE SECRET my_secret (
TYPE ducklake,
METADATA_PATH 'metadata.db',
DATA_PATH 's3://my-s3-bucket/'
);
ATTACH 'ducklake:my_secret';
除了命名密钥之外,还可以有一个未命名密钥。使用空连接字符串进行连接时,此未命名密钥用于进行连接:
CREATE SECRET (
TYPE ducklake,
METADATA_PATH 'metadata.db',
DATA_PATH 's3://my-s3-bucket/'
);
此版本新增了对 DuckLake 的更多设置支持,特别是关于Parquet 文件写入的设置。现已支持以下设置列表。设置范围可以是整个 DuckLake 的全局范围,也可以是每个架构和每个表的级别。这些设置将持久化到 DuckLake ducklake_metadata 表中 。
parquet_compression:Parquet 文件的压缩算法(未压缩、snappy、gzip、zstd、brotli、lz4)。parquet_version:Parquet 格式版本(1 或 2)。parquet_compression_level:Parquet 文件的压缩级别。parquet_row_group_size:Parquet 文件中每个行组的行数。parquet_row_group_size_bytes:Parquet 文件中每个行组的字节数。target_file_size:插入和压缩操作的目标数据文件大小。可以使用如下set_option方法设置:
CALL ducklake.set_option('parquet_compression', 'zstd');
可以使用新options功能读取给定的 DuckLake 设置。
FROM ducklake.options();
我们添加了ducklake_list_files函数。此函数返回扫描给定快照的表数据时必须扫描的数据及其对应的删除文件列表。这有助于将 DuckLake 集成到其他系统中。
FROM ducklake_list_files('ducklake', 'file');
此版本还增加了使用duckdb CLI 和其他客户端直接连接 DuckLake 的支持:
duckdb ducklake:my_file.db
DuckLake 0.2 标准中的更新
在旧的 DuckLake 标准中,路径始终仅相对于全局数据路径。在 DuckLake v0.2 标准中,数据和删除文件的写入位置现在分为三层:
这样可以以更结构化的方式写入数据文件。默认情况下,架构和表名称被设置为文件写入的路径。例如:
main/
my_table/
ducklake-uuid1.parquet
ducklake-uuid2.parquet
路径存储在ducklake_table和ducklake_schema表中。
通过在给定子目录中写入给定表的所有文件,现在可以在对象存储级别使用基于前缀的访问控制,以授予用户仅访问数据库中特定模式或表的权限。
DuckLake 默认使用字段 ID 来执行列映射。通过 DuckLake 写入 Parquet 文件时,每列都包含一个字段 ID,用于指示其所属的顶级列。这使得 DuckLake 可以执行仅针对元数据的修改操作,例如重命名和删除字段。
当注册通过其他方式或其他写入器写入的现有 Parquet 文件时,这些文件通常不会写入字段标识符。为了方便在 DuckLake 中使用这些 Parquet 文件,v0.2 版本新增了一种以名称映射形式映射列的方法。这样就可以按如下方式注册 Parquet 文件:
ATTACH 'ducklake:my_ducklake.db' AS my_ducklake;
CREATE TABLE my_ducklake.people (id BIGINT, name VARCHAR);
COPY (SELECT 42 AS id, 'Mark' AS name) TO 'people.parquet';
CALL ducklake_add_data_files('my_ducklake', 'people', 'people.parquet');
FROM my_ducklake.people;
┌───────┬─────────┐
│ id │ name │
│ int64 │ varchar │
├───────┼─────────┤
│ 42 │ Mark │
└───────┴─────────┘
每个添加到 DuckLake 的文件都有一个可选的mapping_id,用于告知系统列名到字段 ID 的映射。由于此操作是按文件逐个执行的,因此 Parquet 文件始终可以不受限制地添加到 DuckLake。所有 DuckLake 操作均支持对添加的文件进行操作,包括架构演变和数据变更提要。
DuckLake v0.2新增了对作用域设置的支持。ducklake_metadata表中存储的设置现在包含一个可选的作用域字段,以及一个scope_id。这允许在架构或表级别限定设置的作用域,而不必要求所有设置都具有全局作用域。
此版本增加了对年/月/日/小时分区转换的支持,允许使用这些函数直接对数据进行分区,而不必创建包含这些字段的单独列。
当 DuckDB 连接到运行 v0.1 版本的 DuckLake 时,会自动触发迁移,将 DuckLake 更新至 v0.2 版本。执行迁移所需的 SQL 查询如下。
ALTER TABLE ducklake_schema ADD COLUMN path VARCHAR DEFAULT '';
ALTER TABLE ducklake_schema ADD COLUMN path_is_relative BOOLEAN DEFAULT true;
ALTER TABLE ducklake_table ADD COLUMN path VARCHAR DEFAULT '';
ALTER TABLE ducklake_table ADD COLUMN path_is_relative BOOLEAN DEFAULT true;
ALTER TABLE ducklake_metadata ADD COLUMN scope VARCHAR;
ALTER TABLE ducklake_metadata ADD COLUMN scope_id BIGINT;
ALTER TABLE ducklake_data_file ADD COLUMN mapping_id BIGINT;
CREATE TABLE ducklake_column_mapping (mapping_id BIGINT, table_id BIGINT, type VARCHAR);
CREATE TABLE ducklake_name_mapping (mapping_id BIGINT, column_id BIGINT, source_name VARCHAR, target_field_id BIGINT, parent_column BIGINT);
UPDATE ducklake_partition_column
SET column_id = (SELECT list(column_id ORDER BY column_order)
FROM ducklake_column
WHERE table_id = ducklake_partition_column.table_id AND parent_column IS NULL AND end_snapshot IS NULL)[ducklake_partition_column.column_id + 1];
UPDATE ducklake_metadata
SET value = '0.2'
WHERE key = 'version';