

 2026 年 6 月 30 日之后，Amazon Redshift 不再支持使用 Python UDF。我们将分阶段开始执行。有关 Python 生命周期终止和迁移选项详情的更多信息，请参阅 2025 年 6 月 30 日发布的[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# Amazon Redshift 中的 Apache Iceberg v3 功能
<a name="iceberg-v3-features"></a>

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

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

## 创建 Iceberg v3 表
<a name="iceberg-v3-creating"></a>

要创建 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
<a name="iceberg-v3-upgrading"></a>

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

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

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

**重要**  
在升级到 Iceberg v3 之前，请查看[限制](#iceberg-v3-limitations)部分，因为 v3 表尚不支持某些功能。由于不支持从 v3 降级到 v2，因此，请在继续升级之前，确保不受支持的功能不会影响您的工作负载。

## 限制
<a name="iceberg-v3-limitations"></a>
+ 您只能在 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 类型。因此，您的查询会返回包含时区信息的时间戳。

## 默认列值
<a name="iceberg-v3-default-values"></a>

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

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

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

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

### 在创建表时定义默认值
<a name="iceberg-v3-default-values-create"></a>

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

### 添加带有默认值的列
<a name="iceberg-v3-default-values-add-column"></a>

```
ALTER TABLE {{iceberg_table}}
ADD COLUMN column_name data_type DEFAULT literal_value;
```

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

### 更改或移除默认值
<a name="iceberg-v3-default-values-change"></a>

```
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 行为
<a name="iceberg-v3-default-values-insert"></a>

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

### SHOW TABLE
<a name="iceberg-v3-default-values-show-table"></a>

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

## 行谱系
<a name="iceberg-v3-row-lineage"></a>

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

### 伪列
<a name="iceberg-v3-row-lineage-columns"></a>


| 列 | 数据类型 | 说明 | 
| --- | --- | --- | 
| \_row\_id | BIGINT | 唯一标识表中的每一行。在写入操作时自动分配。 | 
| \_last\_updated\_sequence\_number | BIGINT | 修改该行的上次写入操作的快照序列号。 | 

### 查询行谱系
<a name="iceberg-v3-row-lineage-querying"></a>

必须在 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 表上的行为
<a name="iceberg-v3-row-lineage-non-v3"></a>

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

### v2 升级到 v3 后的行为
<a name="iceberg-v3-row-lineage-upgrade"></a>

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

### 写入行为
<a name="iceberg-v3-row-lineage-writes"></a>

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

### 限制
<a name="iceberg-v3-row-lineage-limitations"></a>
+ 行谱系列不包含在 SELECT \* 中。
+ Iceberg v2 及更早版本的表不支持行谱系。
+ 在从 v2 升级到 v3 的表中，升级前的数据在升级后的首个写入操作之前，对于两个伪列均返回 NULL。

## 删除向量
<a name="iceberg-v3-deletion-vectors"></a>

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

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

### 删除向量的工作原理
<a name="iceberg-v3-deletion-vectors-how"></a>

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

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

### 相较于位置删除文件的优势
<a name="iceberg-v3-deletion-vectors-benefits"></a>
+ 删除向量比位置删除文件更紧凑。
+ 每个数据文件只有一个删除向量，可避免积累许多小型删除文件。
+ 对同一数据文件的后续删除会生成一个新的删除向量，用于将先前的删除与新删除的位置合并，从而使每个数据文件只保留一个删除向量。
+ 由于删除向量更紧凑，且可避免积累许多小型文件，因此与 Iceberg v2 位置删除文件相比，读取和写入速度更快。

### v2 升级到 v3 后的行为
<a name="iceberg-v3-deletion-vectors-upgrade"></a>

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

### 限制
<a name="iceberg-v3-deletion-vectors-limitations"></a>
+ Iceberg v2 及更早版本的表不支持删除向量。
+ 对于新的写入操作，Iceberg v3 表无法回退到位置删除文件。这意味着 Iceberg v3 表可以读取现有的位置删除文件，但不能添加新的位置删除文件。相反，Iceberg v3 表只能使用删除向量来添加新的删除。