预览:DuckDB 中的 Amazon S3 Tables 和 Lakehouse
预览:DuckDB 中的 Amazon S3 Tables
Sam Ansmink, Tom Ebergen, Gabor Szarnyas 发布于 2025-03-14
简述:我们很高兴地宣布一项新的预览功能,该功能增加了对 Apache Iceberg REST Catalogs 的支持,使 DuckDB 用户能够轻松连接到 Amazon S3 Tables 和 Amazon SageMaker Lakehouse。
Iceberg 来临!
近年来,Iceberg open table format 越来越受欢迎。主要的数仓平台,如 Databricks, Snowflake, Google BigQuery 和 AWS 都已经宣布或实现了对 Iceberg 表的支持。这些平台还支持 Iceberg catalogs,后者负责跟踪按命名空间分组的 Iceberg 表集合的当前元数据。
DuckDB 从 2023 年 9 月起 通过 iceberg
extension 支持读取 Iceberg 表。今天,我们很高兴在此 extension 中推出一项新的预览功能,该功能允许连接到 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 endpoints 的支持是 AWS 和 DuckDB Labs 合作的结果。
在 DuckDB 中使用 Apache Iceberg REST Catalogs
安装步骤
要在 DuckDB 中连接到 Apache Iceberg REST Catalogs,请确保您运行的是 最新的稳定 DuckDB 版本(版本 1.2.1)。对于我们的示例步骤,我们将使用 DuckDB CLI client。您可以从 installation page 获取此 client 并使用以下命令启动它:
duckdb
接下来,我们需要从 core_nightly
repository 安装所需 extension 的“bleeding edge”版本。
FORCE INSTALL aws FROM core_nightly;
FORCE INSTALL httpfs FROM core_nightly;
FORCE INSTALL iceberg FROM core_nightly;
注意
有关使用
core_nightly
repository 的更多信息,请参阅帖子末尾的 notes。
安装了这些 extension 后,您的 DuckDB 现在可以使用 Apache Iceberg REST Catalogs。让我们找一些数据。
设置 Amazon S3 Table Bucket
(如果您的 Amazon S3 Tables 中已经有 Iceberg 表,则可以跳到 “使用 DuckDB 读取 Iceberg Catalogs”部分。)
在这篇文章中,我们将演示如何从 Amazon S3 Tables 读取数据。要继续操作,请确保您的帐户具有 s3tables
permissions 并创建一个新的 S3 table bucket。请注意,Amazon S3 Tables 当前仅在 selected AWS regions 中受支持。
填充 Amazon S3 Table Bucket
如果您没有已经包含表的 S3 table bucket,我们发现最简单的方法是使用 Amazon Athena 创建一个表。请参阅他们的 instructions。对于我们的示例,我们使用 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
目录中的默认 profile 检测您的 AWS 凭据和配置,方法是使用 Secrets Manager 创建以下 secret:
CREATE SECRET (
TYPE s3,
PROVIDER credential_chain
);
或者,您可以手动设置 AWS key、secret 和 region 值。例如:
CREATE SECRET (
TYPE s3,
KEY_ID 'AKIAIOSFODNN7EXAMPLE',
SECRET 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
REGION 'us-east-1'
);
提示
要查看会话中的 secret,请运行
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 endpoint 连接到 S3 Tables。为此,请运行:
ATTACH 'account_id:s3tablescatalog/namespace_name'
AS (
TYPE iceberg,
ENDPOINT_TYPE glue
);
提示
如果您需要对单个 S3 table bucket 中的表格数据进行基本读取访问,请使用
s3_tables
endpoint type。如果您想要跨 AWS 中所有表格数据的统一视图,请使用glue
endpoint type。
Schema Evolution
Iceberg 格式的一个关键特性是 schema evolution,即能够跟踪表 schema 中的更改。为了演示这一点,我们回到 Athena 查询编辑器并将新列添加到 duck_species
表:
ALTER TABLE duck_species
ADD COLUMNS (conservation_status STRING);
然后,我们插入更多的 duck species:
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;
该查询现在返回一个包含附加的第四列的表,该列在 schema 更改之前插入的行中具有 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
extension 的最新预览版本允许使用 Iceberg REST endpoints 直接读取表。这使您可以轻松查询 Amazon S3 Tables 和 Amazon SageMaker Lakehouse (AWS Glue Data Catalog)。截至今天,该 extension 处于实验状态,并且正在积极开发中。我们将在今年晚些时候发布一个稳定版本。
Footnotes
清理
如果您创建了一个新的 S3 table bucket 来按照示例进行操作,请不要忘记通过 deleting your S3 table bucket 进行清理。
使用 core_nightly
Repository
此博客文章中使用的 extension 当前是实验性的,因此它们通过 core_nightly
repository 分发。如果您想切换回使用来自 core
repository 的 extension,请按照 extension documentation 进行操作。
请注意,DuckDB 不支持重新加载 extension。因此,如果您遇到任何问题,请尝试在更新 extension 后重新启动 DuckDB。
在本文中
Recent Posts
The DuckDB Local UI
2025-03-12
Jeff Raymakers and Gabor Szarnyas
deep dive
Parquet Bloom Filters in DuckDB
2025-03-07 Hannes Mühleisen All blog posts
Documentation
Getting Started Installation Guides Data Import Client APIs SQL Introduction Why DuckDB FAQ
Resources
Blog Media Events Webshop Code of Conduct Trademark Use Release Calendar RSS Feed Status Page
Organizations
Community
Community Extensions Bluesky LinkedIn X (Twitter) Discord Stack Overflow © 2025 DuckDB Foundation, Amsterdam NL