2026 年 6 月 30 日之后,Amazon Redshift 不再支持使用 Python UDF。我们将分阶段开始执行。有关 Python 生命周期终止和迁移选项详情的更多信息,请参阅 2025 年 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 或 v3 表。 -
所有
ALTER TABLE语句都是仅限元数据的操作。 -
ALTER TABLE语句不支持包含复杂类型列的表。
目录
升级到 Iceberg v3
您可以使用 ALTER TABLE SET
TABLE PROPERTIES 将 Iceberg v2 表升级到 v3:
ALTER TABLEiceberg_tableSET TABLE PROPERTIES ('format-version' = '3');
有关其他详细信息,请参阅从 v2 升级到 v3。
ALTER TABLE RENAME COLUMN
ALTER TABLEiceberg_tableRENAME [COLUMN]col_nameTOnew_name;
ALTER TABLE RENAME COLUMN 重命名现有列。 可以是分区列或非分区列。重命名后,列的数据类型和分区规范不会改变。col_name
注意
Amazon Lake Formation 已注册的表不支持 ALTER TABLE RENAME COLUMN。
ALTER TABLE ADD/DROP COLUMN
ALTER TABLEiceberg_tableADD [COLUMN]col_namecol_type;
ALTER TABLEiceberg_tableDROP [COLUMN]col_name;
ADD COLUMN 向现有 Iceberg 表添加一列。可以使用 Amazon Redshift Iceberg 写入所支持的任何数据类型。有关更多信息,请参阅 Apache Iceberg 表支持的数据类型。
ADD COLUMN 是仅限元数据的操作。现有行上新添加的列的值为 NULL。
DROP COLUMN 从现有 Iceberg 表中删除一列。对于分区表,您不能删除属于当前分区规范的列。在删除列之前,必须先移除涉及该列的分区字段。有关更多信息,请参阅 ALTER TABLE ADD、DROP 和 REPLACE PARTITION FIELD。
对于 Iceberg v3 表,您可以在添加列时指定默认值。现有数据文件无需重写数据,即可为新添加的列返回指定的默认值,而非 NULL。仅 Iceberg v3 表支持默认列值。如果您在 Iceberg v2 表上指定默认值,Amazon Redshift 将返回错误。
-- External schema notation ALTER TABLE my_external_schema.orders ADD COLUMN priority INT DEFAULT 0; -- Three-part notation (awsdatacatalog / Glue) ALTER TABLE awsdatacatalog.my_glue_db.orders ADD COLUMN priority INT DEFAULT 0; -- Three-part notation (S3 Table Buckets) ALTER TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ADD COLUMN priority INT DEFAULT 0;
对于现有行,将为新添加的列填充默认值:
-- Existing table with rows SELECT id FROM my_external_schema.orders; -- 1 -- 2 -- Add a column with a default ALTER TABLE my_external_schema.orders ADD COLUMN status varchar DEFAULT 'active'; -- Existing rows return the default without a data rewrite SELECT id, status FROM my_external_schema.orders; -- 1 | active -- 2 | active
ALTER TABLE ALTER COLUMN
ALTER TABLEiceberg_tableALTER COLUMNcolumn_nameTYPEupdated_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 字节整数使用类型名称 int 或 int4。只要它们映射到 Iceberg 类型中的 4 字节整数,就支持将类型扩大为 8 字节整数。
例如,使用 4 字节整数类型创建一个 Iceberg 表:
CREATE TABLEiceberg_table(cint int) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/';
可以通过此 ALTER 语句来扩大其范围:
ALTER TABLEiceberg_tableALTER COLUMN cint TYPE int8;
有关 Amazon Redshift 类型和 Iceberg 类型之间数据类型映射的完整列表,请参阅 Apache Iceberg 表支持的数据类型。
不支持扩大属于现有分区规范的列的类型。
对于 Iceberg v3 表,您可以在现有列上设置或移除默认值:
ALTER TABLEiceberg_tableALTER COLUMNcolumn_nameSET DEFAULTliteral_value; ALTER TABLEiceberg_tableALTER COLUMNcolumn_nameDROP DEFAULT;
SET DEFAULT 会更改现有列的默认值。新的默认值适用于更改后写入的数据文件。现有数据文件将继续使用之前的默认值。
DROP DEFAULT 会移除应用于新写入的默认值,相当于将默认值设置为 NULL。不包含该列的数据文件将继续返回该列的初始默认值。
-- External schema notation ALTER TABLE my_external_schema.orders ALTER COLUMN status SET DEFAULT 'active'; ALTER TABLE my_external_schema.orders ALTER COLUMN status DROP DEFAULT; -- Three-part notation (awsdatacatalog / Glue) ALTER TABLE awsdatacatalog.my_glue_db.orders ALTER COLUMN status SET DEFAULT 'active'; ALTER TABLE awsdatacatalog.my_glue_db.orders ALTER COLUMN status DROP DEFAULT; -- Three-part notation (S3 Table Buckets) ALTER TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ALTER COLUMN status SET DEFAULT 'active'; ALTER TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ALTER COLUMN status DROP DEFAULT;
ALTER TABLE SET TABLE PROPERTIES
ALTER TABLEiceberg_tableSET TABLE PROPERTIES ( 'compression_type' = 'compression_value');
此语句支持您覆盖默认的表属性。目前,该语句唯一支持的表属性是 compression_type。您可以将其覆盖,以便对 Iceberg 表 Parquet 文件使用不同的压缩类型。在 ALTER 之后插入的数据使用新的压缩类型。
compression_type 的可能值包括 brotli、gzip、snappy、uncompressed 和 zstd。
您也可以通过设置格式版本,将现有的 Iceberg v2 表升级到 v3:
ALTER TABLEiceberg_tableSET TABLE PROPERTIES ('format-version' = '3');
有关其他详细信息,请参阅从 v2 升级到 v3。
ALTER TABLE ADD、DROP 和 REPLACE PARTITION FIELD
ALTER TABLEiceberg_tableADD PARTITION FIELDcolumn_name|transform_function;
ALTER TABLEiceberg_tableDROP PARTITION FIELDcolumn_name|transform_function;
ALTER TABLEiceberg_tableREPLACE PARTITION FIELDcolumn_name|transform_functionWITHcolumn_name|transform_function;
[ADD | DROP | REPLACE] PARTITION FIELD 语句支持您更改现有的表分区规范,从而支持通过 Amazon Redshift 进行分区演变。
分区规范的 ALTER 语句仅更改表元数据,而不会对现有表数据进行重新分区。在 ALTER 之后,插入到表中的新数据遵循新定义的分区规范。
考虑这些语句的以下限制:
-
通过
ADD或REPLACE ... WITH ...定义新的分区字段时,新字段不能包含已经是其它分区字段的一部分的列。这与您在CREATE TABLE中定义初始分区规范时的限制相同。有关更多信息,请参阅 CREATE TABLE。例如,当您有一个表时:
CREATE TABLEiceberg_table... PARTITIONED BY year(ship_date) USING ICEBERG ...;以下操作失败,因为
ship_date已经是现有分区字段的一部分:ALTER TABLEiceberg_tableADD PARTITION FIELD bucket(128, ship_date); -
添加新的分区字段时,新添加的字段始终被视为表的最后一个分区级别。例如:
CREATE TABLEiceberg_table... PARTITIONED BY year(ship_date) USING ICEBERG ...; ALTER TABLEiceberg_tableADD PARTITION FIELD bucket(256, item_id);表分区规范与以下内容相同:
CREATE TABLEiceberg_table... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; -
删除分区字段时,它不仅限于最后一个分区级别。您可以删除任何现有的分区字段。例如:
CREATE TABLEiceberg_table... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLEiceberg_tableDROP PARTITION FIELD year(ship_date);在此
ALTER后,该表仅按bucket(256, item_id)进行分区。 -
调用
REPLACE PARTITION FIELD ... WITH ...时,要替换的分区字段可以是规范中的任何字段,而不限于最后一个字段。例如:CREATE TABLEiceberg_table... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLEiceberg_tableREPLACE PARTITION FIELD year(ship_date) WITH month(ship_date);在此
ALTER后,表分区变为(month(ship_date), bucket(256, item_id))。 -
分区
ALTER语句中不支持void转换。