View a markdown version of this page

變更資料表定義 - Amazon Redshift

Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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 可以是分割區資料欄或非分割區資料欄。重新命名後,資料欄資料類型和分割區規格不會變更。

注意

ALTER TABLE RENAME COLUMN 已 AWS Lake Formation 註冊的資料表不支援 。

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 欄位

更改資料表更改資料欄

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 iceberg_table SET TABLE PROPERTIES ( 'compression_type' = 'compression_value');

此陳述式可讓您覆寫預設資料表屬性。此陳述式目前唯一允許的資料表屬性為 compression_type。您可以覆寫它,以針對 Iceberg 資料表 Parquet 檔案使用不同的壓縮類型。在 之後插入的資料ALTER會使用新的壓縮類型。

的可能值compression_type為:brotligzipuncompressedsnappyzstd

ALTER TABLE ADD、DROP 和 REPLACE PARTITION 欄位

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,插入資料表的新資料會遵循新定義的分割區規格。

請考慮這些陳述式的下列限制:

  • 透過 ADD或 定義新的分割區欄位時REPLACE ... 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轉換。