预览:DuckDB 中的 Amazon S3 Tables
简而言之:我们很高兴地宣布一项新的预览功能,该功能增加了对 Apache Iceberg REST Catalogs 的支持,使 DuckDB 用户可以轻松连接到 Amazon S3 Tables 和 Amazon SageMaker Lakehouse。
AWS Storage Blog 也发表了一篇关于此功能的文章,请参阅使用 DuckDB 简化对 Amazon S3 Tables 中存储的表格数据集的访问。
Iceberg 就在前方!
近年来,Iceberg 开放表格式越来越受欢迎。主要的数仓平台,例如Databricks,Snowflake,Google BigQuery 和 AWS 都已宣布或已经实现了对 Iceberg 表的支持。这些平台还支持 Iceberg catalogs,它们负责跟踪按命名空间分组的一系列 Iceberg 表的当前元数据。
自2023 年 9 月以来,DuckDB 通过iceberg
扩展支持读取 Iceberg 表。今天,我们很高兴在此扩展中推出一项新的预览功能,该功能允许附加到 Iceberg REST catalogs。此预览版与 AWS 昨天发布的两个公告同时发布:Amazon S3 Tables 中对 Iceberg 表的支持以及 S3 Tables 和 SageMaker Lakehouse(AWS Glue Data Catalog)之间集成的 GA 版本。实际上,这些发展意味着 DuckDB 现在提供了一个端到端的解决方案,用于读取 S3 Tables 和 SageMaker Lakehouse 中的 Iceberg 表。
DuckDB 对 Amazon S3 Tables 中 Iceberg REST Catalog 端点的支持是 AWS 和 DuckDB Labs 之间合作的结果。
在 DuckDB 中使用 Apache Iceberg REST Catalogs
安装步骤
要在 DuckDB 中连接到 Apache Iceberg REST Catalogs,请确保您正在运行最新的稳定 DuckDB 版本(版本 1.2.1)。对于我们的示例步骤,我们将使用 DuckDB CLI 客户端。您可以从安装页面获取此客户端,并使用以下命令启动它
duckdb
接下来,我们需要从 core_nightly
仓库安装所需扩展的“前沿”版本。
FORCE INSTALL aws FROM core_nightly;
FORCE INSTALL httpfs FROM core_nightly;
FORCE INSTALL iceberg FROM core_nightly;
有关使用
core_nightly
仓库的更多信息,请参阅文章末尾的注释。
安装了这些扩展后,您的 DuckDB 现在能够使用 Apache Iceberg REST Catalogs。让我们找到一些数据。
设置 Amazon S3 Table Bucket
(如果您已经在 Amazon S3 Tables 中拥有 Iceberg 表,则可以跳到“使用 DuckDB 读取 Iceberg Catalogs”部分。)
在本文中,我们将演示如何从 Amazon S3 Tables 读取数据。要继续操作,请确保您的帐户具有 s3tables
权限并创建一个新的 S3 table bucket。请注意,Amazon S3 Tables 目前仅在选定的 AWS 区域中受支持。
填充 Amazon S3 Table Bucket
如果您没有包含表的 S3 table bucket,我们发现最简单的方法是使用 Amazon Athena 创建一个表。请参阅他们的说明。对于我们的示例,我们使用 Athena 查询编辑器创建了一个包含三列的简单表
CREATE TABLE duck_species (
id INT,
english_name STRING,
latin_name STRING
) TBLPROPERTIES ('table_type' = 'ICEBERG');
让我们向表中插入一些数据
INSERT INTO duck_species VALUES
(0, 'Anas nivis', 'Snow duck');
使用 DuckDB 读取 Amazon S3 Tables
使用 DuckDB 查询 S3 Tables 非常容易。第一步是将您的 AWS 凭证放入 DuckDB。您可以通过两种方式实现此目的。首先,您可以让 DuckDB 根据 ~/.aws
目录中的默认配置文件检测您的 AWS 凭证和配置,方法是使用 Secrets Manager 创建以下密钥
CREATE SECRET (
TYPE s3,
PROVIDER credential_chain
);
或者,您可以手动设置 AWS 密钥、秘密和区域值。例如
CREATE SECRET (
TYPE s3,
KEY_ID 'AKIAIOSFODNN7EXAMPLE',
SECRET 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
REGION 'us-east-1'
);
提示 要查看会话中的密钥,请运行
FROM duckdb_secrets();
接下来,将 DuckDB 指向您的 S3 table bucket。您可以通过直接从 AWS Management Console 复制粘贴 S3 Tables ARN 值,并在 ATTACH
命令中使用它来实现此目的
ATTACH 'arn:aws:s3tables:us-east-1:111122223333:bucket/bucket-name'
AS s3_tables_db (
TYPE iceberg,
ENDPOINT_TYPE s3_tables
);
就这样!现在,DuckDB 已连接到 Amazon S3 Tables。要显示可用的表,请运行
SHOW ALL TABLES;
┌──────────────┬─────────┬───────────────┬──────────────┬──────────────┬───────────┐
│ database │ schema │ name │ column_names │ column_types │ temporary │
│ varchar │ varchar │ varchar │ varchar[] │ varchar[] │ boolean │
├──────────────┼─────────┼───────────────┼──────────────┼──────────────┼───────────┤
│ s3_tables_db │ ducks │ duck_species │ [__] │ [INTEGER] │ false │
└──────────────┴─────────┴───────────────┴──────────────┴──────────────┴───────────┘
您可以像查询普通 DuckDB 表一样查询表
FROM s3_tables_db.ducks.duck_species;
┌───────┬──────────────┬────────────┐
│ id │ english_name │ latin_name │
│ int32 │ varchar │ varchar │
├───────┼──────────────┼────────────┤
│ 0 │ Anas nivis │ Snow duck │
└───────┴──────────────┴────────────┘
您还可以选择使用 Amazon SageMaker Lakehouse(AWS Glue Data Catalog)Iceberg REST Catalog 端点连接到 S3 Tables。为此,请运行
ATTACH 'account_id:s3tablescatalog/namespace_name'
AS (
TYPE iceberg,
ENDPOINT_TYPE glue
);
提示 如果您需要对单个 S3 table bucket 中的表格数据进行基本读取访问,请使用
s3_tables
端点类型。如果您希望在 AWS 中统一查看所有表格数据,请使用glue
端点类型。
Schema Evolution (模式演变)
Iceberg 格式的一个关键特性是模式演变,即能够跟踪表模式中的更改。为了演示这一点,我们回到 Athena 查询编辑器,并向 duck_species
表添加一个新列
ALTER TABLE duck_species
ADD COLUMNS (conservation_status STRING);
然后,我们插入更多鸭子种类
INSERT INTO duck_species VALUES
(1, 'Anas eatoni', 'Eaton''s pintail', 'Vulnerable'),
(2, 'Histrionicus histrionicus', 'Harlequin duck', 'Least concern');
让我们再次从 DuckDB 运行查询
FROM s3_tables_db.ducks.duck_species;
现在,查询返回一个带有附加第四列的表,该列在模式更改之前插入的行中具有 NULL
值 – 正如预期的那样。
┌───────┬───────────────────────────┬─────────────────┬─────────────────────┐
│ id │ english_name │ latin_name │ conservation_status │
│ int32 │ varchar │ varchar │ varchar │
├───────┼───────────────────────────┼─────────────────┼─────────────────────┤
│ 1 │ Anas eatoni │ Eaton's pintail │ Vulnerable │
│ 2 │ Histrionicus histrionicus │ Harlequin duck │ Least concern │
│ 0 │ Anas nivis │ Snow duck │ NULL │
└───────┴───────────────────────────┴─────────────────┴─────────────────────┘
结论
DuckDB iceberg
扩展的最新预览版本支持使用 Iceberg REST 端点直接读取表。这使您可以轻松查询 Amazon S3 Tables 和 Amazon SageMaker Lakehouse(AWS Glue Data Catalog)。截至今天,该扩展程序处于实验状态,并且正在积极开发中。我们将在今年晚些时候发布稳定版本。
脚注
清理
如果您创建了一个新的 S3 table bucket 来遵循示例,请不要忘记通过删除您的 S3 table bucket来清理。
使用 core_nightly
仓库
本文中使用的扩展目前处于实验阶段,因此它们通过 core_nightly
仓库分发。如果您想切换回使用来自 core
仓库的扩展,请遵循扩展文档。
请注意,DuckDB 不支持重新加载扩展。因此,如果您遇到任何问题,请尝试在更新扩展后重新启动 DuckDB。