⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
Iceberg 扩展

iceberg 扩展实现了对 Apache Iceberg 开放表格式的支持,并可以连接到 Iceberg REST Catalogs。有关如何连接到 Iceberg REST Catalog 的信息,请参阅Iceberg REST Catalogs 页面。

安装和加载

要安装 iceberg 扩展,请运行

INSTALL iceberg;

请注意,iceberg 扩展不可自动加载。因此,在使用它之前需要手动加载。

LOAD iceberg;

更新扩展

iceberg 扩展在 DuckDB 版本之间经常收到更新。为确保您拥有最新版本,请更新您的扩展

UPDATE EXTENSIONS;

用法

要测试示例,请下载 iceberg_data.zip 文件并解压。

常见参数

参数 类型 默认值 描述
allow_moved_paths BOOLEAN false 允许扫描已移动的 Iceberg 表
metadata_compression_codec VARCHAR '' 当设置为 'gzip' 时,将元数据文件视为
snapshot_from_id UBIGINT NULL 访问具有特定 id 的快照
snapshot_from_timestamp TIMESTAMP NULL 访问具有特定 timestamp 的快照
version VARCHAR '?' 提供显式版本字符串、提示文件或猜测
version_name_format VARCHAR 'v%s%s.metadata.json,%s%s.metadata.json' 控制版本如何转换为元数据文件名

查询单个表

SELECT count(*)
FROM iceberg_scan('data/iceberg/lineitem_iceberg', allow_moved_paths = true);
count_star()
51793

allow_moved_paths 选项确保执行某些路径解析,从而允许扫描已移动的 Iceberg 表。

您也可以在查询中直接指定当前的清单(manifest),这可以在查询之前从目录中解析,在此示例中,清单版本是 UUID。为此,请导航到 data/iceberg 目录并运行

SELECT count(*)
FROM iceberg_scan('lineitem_iceberg/metadata/v1.metadata.json');
count_star()
60175

iceberg 扩展与 httpfs 扩展azure 扩展协同工作,以访问 S3 或 Azure Blob Storage 等对象存储中的 Iceberg 表。

SELECT count(*)
FROM iceberg_scan('s3://bucketname/lineitem_iceberg/metadata/v1.metadata.json');

访问 Iceberg 元数据

要访问 Iceberg 元数据,可以使用 iceberg_metadata 函数

SELECT *
FROM iceberg_metadata('data/iceberg/lineitem_iceberg', allow_moved_paths = true);

您也可以在通过 REST Catalog 附加的 Iceberg 表上运行 iceberg_metadata 函数

SELECT *
FROM iceberg_metadata(iceberg_table);
manifest_path manifest_sequence_number manifest_content status content file_path file_format record_count
lineitem_iceberg/metadata/10eaca8a-1e1c-421e-ad6d-b232e5ee23d3-m1.avro 2 数据 ADDED EXISTING lineitem_iceberg/data/00041-414-f3c73457-bbd6-4b92-9c15-17b241171b16-00001.parquet PARQUET 51793
lineitem_iceberg/metadata/10eaca8a-1e1c-421e-ad6d-b232e5ee23d3-m0.avro 2 数据 DELETED EXISTING lineitem_iceberg/data/00000-411-0792dcfe-4e25-4ca3-8ada-175286069a47-00001.parquet PARQUET 60175

可视化快照

要可视化 Iceberg 表中的快照,请使用 iceberg_snapshots 函数

SELECT *
FROM iceberg_snapshots('data/iceberg/lineitem_iceberg');

您也可以在通过 REST Catalog 附加的 Iceberg 表上运行 iceberg_snapshots 函数

SELECT *
FROM iceberg_snapshots(iceberg_table);
sequence_number snapshot_id timestamp_ms manifest_list
1 3776207205136740581 2023-02-15 15:07:54.504 lineitem_iceberg/metadata/snap-3776207205136740581-1-cf3d0be5-cf70-453d-ad8f-48fdc412e608.avro
2 7635660646343998149 2023-02-15 15:08:14.73 lineitem_iceberg/metadata/snap-7635660646343998149-1-10eaca8a-1e1c-421e-ad6d-b232e5ee23d3.avro

选择元数据版本

默认情况下,iceberg 扩展将查找 version-hint.text 文件以识别要使用的正确元数据版本。这可以通过向 iceberg 扩展的函数显式提供 version 参数来覆盖。

SELECT *
FROM iceberg_snapshots(
    'data/iceberg/lineitem_iceberg',
    version = '1',
    allow_moved_paths = true
);

默认情况下,当指定 metadata_compression_codec = 'gzip' 时,iceberg 函数将同时查找 v{version}.metadata.json{version}.metadata.json 文件,或 v{version}.gz.metadata.json{version}.gz.metadata.json 文件。不支持其他压缩编解码器。

如果通过 version 参数提供了任何文本文件,它将被打开并视为版本提示文件

SELECT *
FROM iceberg_snapshots(
    'data/iceberg/lineitem_iceberg',
    version = 'version-hint.txt',
    allow_moved_paths = true
);

iceberg 扩展将打开此文件,并将其全部内容用作提供的版本号。请注意,version-hint.txt 文件的全部内容将被视为文字版本名称,不进行编码、转义或修剪。这包括任何空白字符或不安全字符,这些字符将按照下述逻辑明确格式化到文件名中。

使用备选元数据命名约定

iceberg 扩展可以通过 version_name_format 参数将其指定为逗号分隔的格式字符串列表来处理不同的元数据命名约定。每个格式字符串必须包含两个 %s 参数。第一个是元数据文件名中版本号的位置,第二个是 metadata_compression_codec 指定的文件名扩展名的位置。上述行为由默认值 "v%s%s.metadata.gz,%s%smetadata.gz 提供。如果您有一个替代命名的元数据文件,例如 rev-2.metadata.json.gz,则可以通过以下语句读取该表

SELECT *
FROM iceberg_snapshots(
    'data/iceberg/alternative_metadata_gz_naming',
    version = '2',
    version_name_format = 'rev-%s.metadata.json%s',
    metadata_compression_codec = 'gzip',
    allow_moved_paths = true
);

“猜测”元数据版本

默认情况下,iceberg 扩展读取表必须提供表版本号或 version-hint.text 文件。这通常由外部数据目录提供。如果两者都不存在,iceberg 扩展可以通过将 ? 作为 version 参数来尝试猜测最新版本

SELECT count(*)
FROM iceberg_scan(
    'data/iceberg/lineitem_iceberg_no_hint',
    version = '?',
    allow_moved_paths = true
);

在对文件名进行排序时,假定“最新”版本是字典序最大的文件名。不考虑排序规则。此行为默认未启用,因为它可能违反 ACID 约束。可以通过将 unsafe_enable_version_guessing 设置为 true 来启用此功能。当此设置启用时,iceberg 函数将默认尝试猜测最新版本,然后才会失败。

SET unsafe_enable_version_guessing = true;
SELECT count(*)
FROM iceberg_scan(
    'data/iceberg/lineitem_iceberg_no_hint',
    allow_moved_paths = true
);

限制

目前不支持写入(即导出到)Iceberg 文件。

本节页面