View a markdown version of this page

變更資料表定義 - Amazon Redshift

Amazon Redshift 將不再支援在 2026 年 6 月 30 日之後使用 Python UDFs。我們將開始分階段強制執行。如需 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

您可以使用 將 Iceberg v2 資料表升級至 v3ALTER TABLE SET TABLE PROPERTIES:

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

如需其他詳細資訊,請參閱從 v2 升級到 v3。

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

對於 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 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 位元組整數使用類型名稱 int或 int4。只要它們映射到 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 資料表支援的資料類型。

不支援擴展屬於現有分割區規格的資料欄類型。

對於 Iceberg v3 資料表,您可以在現有資料欄上設定或移除預設值:

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 會移除套用至新寫入的預設值,相當於將預設值設定為 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 iceberg_table SET TABLE PROPERTIES ( 'compression_type' = 'compression_value');

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

的可能值compression_type為:brotli、gzip、uncompressed、 snappy和 zstd。

您也可以設定格式版本,將現有的 Iceberg v2 資料表升級至 v3:

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

如需其他詳細資訊,請參閱從 v2 升級到 v3。

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轉換。