从补丁 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 TABLEiceberg_tableRENAME [COLUMN]col_nameTOnew_name;
ALTER TABLE RENAME COLUMN 重命名现有列。 可以是分区列或非分区列。重命名后,列的数据类型和分区规范不会改变。col_name
注意
AWS 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。
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 表支持的数据类型。
不支持扩大属于现有分区规范的列的类型。
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。
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转换。