View a markdown version of this page

更改表定义 - Amazon Redshift

从补丁 198 开始,Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息,请参阅博客文章

更改表定义

ALTER TABLE 语句用于更改表定义,包括架构、分区规范和属性。您可以使用这些 DDL 语句直接通过 Amazon Redshift 管理 Iceberg 表。

所有 ALTER TABLE 语句都支持对 Iceberg 表使用外部架构引用或三部分表示法引用。在下面的语法示例中,iceberg_table 可以是以下任何一项:

-- External schema notation: <external_schema>.<table_name> -- Three-part notation for S3 table buckets: "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> -- Three-part notation for the awsdatacatalog root catalog: awsdatacatalog.<database_name>.<table_name>

有关更多信息,请参阅 在 Amazon Redshift 中引用 Iceberg 表

使用 ALTER TABLE 语句时,请注意以下事项:

  • ALTER TABLE 语句目前仅支持 Iceberg v2 表。

  • 所有 ALTER TABLE 语句都是仅限元数据的操作。

  • ALTER TABLE 语句不支持包含复杂类型列的表。

ALTER TABLE RENAME COLUMN

ALTER TABLE iceberg_table RENAME [COLUMN] col_name TO new_name;

ALTER TABLE RENAME COLUMN 重命名现有列。col_name 可以是分区列或非分区列。重命名后,列的数据类型和分区规范不会改变。

注意

AWS Lake Formation 已注册的表不支持 ALTER TABLE RENAME COLUMN

ALTER TABLE ADD/DROP COLUMN

ALTER TABLE iceberg_table ADD [COLUMN] col_name col_type;
ALTER TABLE iceberg_table DROP [COLUMN] col_name;

ADD COLUMN 向现有 Iceberg 表添加一列。可以使用 Amazon Redshift Iceberg 写入所支持的任何数据类型。有关更多信息,请参阅 Apache Iceberg 表支持的数据类型

ADD COLUMN 是仅限元数据的操作。现有行上新添加的列的值为 NULL

DROP COLUMN 从现有 Iceberg 表中删除一列。对于分区表,您不能删除属于当前分区规范的列。在删除列之前,必须先移除涉及该列的分区字段。有关更多信息,请参阅 ALTER TABLE ADD、DROP 和 REPLACE PARTITION FIELD

ALTER TABLE ALTER COLUMN

ALTER TABLE iceberg_table ALTER COLUMN column_name TYPE updated_data_type;

ALTER TABLE ALTER COLUMN 更改现有列的数据类型。只支持扩大类型,而不支持缩小。由于 ALTER 之后不会重写数据,因此在使用现有表数据时,缩小数据类型可能会导致溢出。根据 Iceberg 规范,支持进行以下类型的扩大:

int → bigint float → double decimal(P, S) → decimal(P2, S) where P2 > P (scale cannot be changed)

在 Amazon Redshift 中,数据类型可以具有别名。例如,4 字节整数使用类型名称 intint4。只要它们映射到 Iceberg 类型中的 4 字节整数,就支持将类型扩大为 8 字节整数。

例如,使用 4 字节整数类型创建一个 Iceberg 表:

CREATE TABLE iceberg_table (cint int) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/';

可以通过此 ALTER 语句来扩大其范围:

ALTER TABLE iceberg_table ALTER COLUMN cint TYPE int8;

有关 Amazon Redshift 类型和 Iceberg 类型之间数据类型映射的完整列表,请参阅 Apache Iceberg 表支持的数据类型

不支持扩大属于现有分区规范的列的类型。

ALTER TABLE SET TABLE PROPERTIES

ALTER TABLE iceberg_table SET TABLE PROPERTIES ( 'compression_type' = 'compression_value');

此语句支持您覆盖默认的表属性。目前,该语句唯一支持的表属性是 compression_type。您可以将其覆盖,以便对 Iceberg 表 Parquet 文件使用不同的压缩类型。在 ALTER 之后插入的数据使用新的压缩类型。

compression_type 的可能值包括 brotligzipsnappyuncompressedzstd

ALTER TABLE ADD、DROP 和 REPLACE PARTITION FIELD

ALTER TABLE iceberg_table ADD PARTITION FIELD column_name | transform_function;
ALTER TABLE iceberg_table DROP PARTITION FIELD column_name | transform_function;
ALTER TABLE iceberg_table REPLACE PARTITION FIELD column_name | transform_function WITH column_name | transform_function;

[ADD | DROP | REPLACE] PARTITION FIELD 语句支持您更改现有的表分区规范,从而支持通过 Amazon Redshift 进行分区演变。

分区规范的 ALTER 语句仅更改表元数据,而不会对现有表数据进行重新分区。在 ALTER 之后,插入到表中的新数据遵循新定义的分区规范。

考虑这些语句的以下限制:

  • 通过 ADDREPLACE ... WITH ... 定义新的分区字段时,新字段不能包含已经是其它分区字段的一部分的列。这与您在 CREATE TABLE 中定义初始分区规范时的限制相同。有关更多信息,请参阅 CREATE TABLE

    例如,当您有一个表时:

    CREATE TABLE iceberg_table ... PARTITIONED BY year(ship_date) USING ICEBERG ...;

    以下操作失败,因为 ship_date 已经是现有分区字段的一部分:

    ALTER TABLE iceberg_table ADD PARTITION FIELD bucket(128, ship_date);
  • 添加新的分区字段时,新添加的字段始终被视为表的最后一个分区级别。例如:

    CREATE TABLE iceberg_table ... PARTITIONED BY year(ship_date) USING ICEBERG ...; ALTER TABLE iceberg_table ADD PARTITION FIELD bucket(256, item_id);

    表分区规范与以下内容相同:

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...;
  • 删除分区字段时,它不仅限于最后一个分区级别。您可以删除任何现有的分区字段。例如:

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLE iceberg_table DROP PARTITION FIELD year(ship_date);

    在此 ALTER 后,该表仅按 bucket(256, item_id) 进行分区。

  • 调用 REPLACE PARTITION FIELD ... WITH ... 时,要替换的分区字段可以是规范中的任何字段,而不限于最后一个字段。例如:

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLE iceberg_table REPLACE PARTITION FIELD year(ship_date) WITH month(ship_date);

    在此 ALTER 后,表分区变为 (month(ship_date), bucket(256, item_id))

  • 分区 ALTER 语句中不支持 void 转换。