View a markdown version of this page

Amazon Redshift 中的 Apache Iceberg v3 功能 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

2026 年 6 月 30 日之后,Amazon Redshift 不再支持使用 Python UDF。我们将分阶段开始执行。有关 Python 生命周期终止和迁移选项详情的更多信息,请参阅 2025 年 6 月 30 日发布的博客文章。

Amazon Redshift 中的 Apache Iceberg v3 功能

Amazon Redshift 支持 Apache Iceberg v3 表。Iceberg v3 引入了默认列值、行谱系跟踪和删除向量。您可以创建新的 v3 表或将现有的 v2 表升级到 v3。

Iceberg v3 表使用与 v2 表相同的 SQL 语法来进行查询和 DML 操作(INSERT、DELETE、UPDATE、MERGE)。此页面上描述的功能特定于 Iceberg v3。

创建 Iceberg v3 表

要创建 Iceberg v3 表,请在 TABLE PROPERTIES 子句中指定 'format-version'='3':

CREATE TABLE external_schema.table_name ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] TABLE PROPERTIES ('format-version'='3' [, 'compression_type'='compression_value']);

示例:

CREATE TABLE my_schema.orders ( id int, status varchar DEFAULT 'pending', priority int DEFAULT 0 ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3');

如果您未指定 format-version,Amazon Redshift 会将该表创建为 Iceberg v2。

从 v2 升级到 v3

您可以将现有的 Iceberg v2 表升级到 v3:

ALTER TABLE iceberg_table SET TABLE PROPERTIES ('format-version' = '3');

升级格式版本是一项仅限元数据的操作。不会重写现有数据文件。现有的 v2 位置删除文件仍然有效,并在读取期间应用。升级后的第一个写入操作会为整个表生成行谱系值。在后续的 DELETE、UPDATE 或 MERGE 操作中,Amazon Redshift 会将 v2 位置删除合并到受该操作影响的数据文件的删除向量中。

重要

在升级到 Iceberg v3 之前,请查看限制部分,因为 v3 表尚不支持某些功能。由于不支持从 v3 降级到 v2,因此,请在继续升级之前,确保不受支持的功能不会影响您的工作负载。

限制

  • 您只能在 Amazon Redshift Serverless 集群(4 RPU 集群除外)以及使用 RG 实例类型的预调配集群上使用 Iceberg v3。

  • 您无法在 Iceberg v3 表中读取或写入复杂类型(struct、list、map、variant)。

  • 您不能在 Iceberg v3 表中使用以下数据类型:struct、list、map、variant、geometry、geography、binary、uuid、time、timestamp_ns、timestamptz_ns 和 unknown。

  • 您不能使用包含相等删除的 Iceberg v3 表。

  • 您无法在 Iceberg v3 表上创建实体化视图。

  • 将表升级到 v3 后,Iceberg 的 timestamptz 类型将映射到 Amazon Redshift TIMESTAMPTZ 类型,而非 v2 中使用的 TIMESTAMP 类型。因此,您的查询会返回包含时区信息的时间戳。

默认列值

仅 Iceberg v3 表支持默认列值。如果您在 Iceberg v2 表上指定默认值,Amazon Redshift 将返回错误。

默认值指定一个文本值,当列没有显式值时将回退到该值。这样,您就可以向现有表中添加新列,而无需重写数据文件。读取先前写入的数据文件时,会自动为新列返回默认值。当 DML 语句省略该列或将 DEFAULT 指定为值时,也会写入默认值。

仅支持文本值作为默认值。嵌套数据类型不支持默认值。

CREATE TABLE AS SELECT 不会从源表继承默认列值。要在新表上定义默认值,请在创建后使用 ALTER TABLE ALTER COLUMN SET DEFAULT。

在创建表时定义默认值

CREATE TABLE external_schema.table_name ( column_name data_type DEFAULT literal_value [, ...] ) USING ICEBERG LOCATION '...' TABLE PROPERTIES ('format-version'='3');

添加带有默认值的列

ALTER TABLE iceberg_table ADD COLUMN column_name data_type DEFAULT literal_value;

现有数据文件无需重写数据,即可为新添加的列返回默认值。

更改或移除默认值

ALTER TABLE iceberg_table ALTER COLUMN column_name SET DEFAULT literal_value; ALTER TABLE iceberg_table ALTER COLUMN column_name DROP DEFAULT;

SET DEFAULT 会更改现有列的默认值。新的默认值适用于更改后写入的数据文件。现有数据文件将继续使用之前的默认值。

DROP DEFAULT 会从列中移除默认值。执行此操作后,新的写入操作将不再为该列应用默认值。不包含该列的数据文件将继续返回该列的初始默认值。

INSERT 行为

插入行时,如果未指定具有默认值的列,则会将默认值写入数据文件。

SHOW TABLE

SHOW TABLE 在其输出中显示默认值。

行谱系

仅 Iceberg v3 表支持行谱系。它提供了两个伪列,用于跟踪行标识和修改历史记录。这些列由 Amazon Redshift 自动管理。您无需设置它们的值。

伪列

列 数据类型 说明
_row_id BIGINT 唯一标识表中的每一行。在写入操作时自动分配。
_last_updated_sequence_number BIGINT 修改该行的上次写入操作的快照序列号。

查询行谱系

必须在 SELECT 列表中明确指定行谱系列。它们不包含在 SELECT * 中。

SELECT _row_id, _last_updated_sequence_number, * FROM my_schema.my_iceberg_v3_table;

您可以在 WHERE、ORDER BY、GROUP BY 和 JOIN 子句中使用行谱系列:

SELECT * FROM my_schema.my_iceberg_v3_table WHERE _last_updated_sequence_number >= 3 ORDER BY _row_id;

非 v3 表上的行为

查询非 Iceberg v3 表时,_row_id 和 _last_updated_sequence_number 返回 NULL。

v2 升级到 v3 后的行为

对于从 Iceberg v2 升级到 v3 的表,行谱系值无法立即用于升级前的数据。_row_id 和 _last_updated_sequence_number 均返回 NULL,直到升级后的第一个写入操作为止,该操作将为整个表生成行谱系值。这是一项仅限元数据的操作,不会重写现有的数据文件。

写入行为

Amazon Redshift 会在所有写入操作(INSERT、CTAS、UPDATE、MERGE)中自动填充行谱系。每行都会收到一个唯一的 _row_id,而 _last_updated_sequence_number 反映了写入该行的提交的快照序列号。

限制

  • 行谱系列不包含在 SELECT * 中。

  • Iceberg v2 及更早版本的表不支持行谱系。

  • 在从 v2 升级到 v3 的表中,升级前的数据在升级后的首个写入操作之前,对于两个伪列均返回 NULL。

删除向量

删除向量是 Iceberg v3 用来跟踪行级删除的机制。它们取代了 Iceberg v2 使用的位置删除文件。

当您对 Iceberg v3 表运行 DELETE、UPDATE 或 MERGE 时,Amazon Redshift 会将已删除的行位置记录在删除向量中,而不是写入单独的位置删除文件。这是自动处理的。无需更改 SQL 语法。

删除向量的工作原理

删除向量是一种压缩位图,用于记录数据文件中的哪些行位置已被删除。删除向量以 Puffin 文件的形式存储在与表数据相同的 S3 位置。每个数据文件最多有一个删除向量。

读取 Iceberg v3 表时,Amazon Redshift 会自动应用删除向量,以便从查询结果中排除已删除的行。

相较于位置删除文件的优势

  • 删除向量比位置删除文件更紧凑。

  • 每个数据文件只有一个删除向量,可避免积累许多小型删除文件。

  • 对同一数据文件的后续删除会生成一个新的删除向量,用于将先前的删除与新删除的位置合并,从而使每个数据文件只保留一个删除向量。

  • 由于删除向量更紧凑,且可避免积累许多小型文件,因此与 Iceberg v2 位置删除文件相比,读取和写入速度更快。

v2 升级到 v3 后的行为

将表从 Iceberg v2 升级到 v3 后,现有的 v2 位置删除文件仍然有效,并会在读取时应用。在后续写入操作(DELETE、UPDATE 或 MERGE)中,Amazon Redshift 会按照 Iceberg 规范的定义,将现有的 v2 位置删除合并到删除向量中。

限制

  • Iceberg v2 及更早版本的表不支持删除向量。

  • 对于新的写入操作,Iceberg v3 表无法回退到位置删除文件。这意味着 Iceberg v3 表可以读取现有的位置删除文件,但不能添加新的位置删除文件。相反,Iceberg v3 表只能使用删除向量来添加新的删除。