Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊,請參閱部落格文章
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
SQL 命令
Amazon Redshift 中的 Apache Iceberg 資料表提供強大的方法來管理資料湖中的大型分析資料集。這些資料表支援 ACID 交易、結構描述演變和時間歷程功能,同時維持分析工作負載的高效能。使用 Apache Iceberg 資料表,您可以有效率地整理和分割資料、控制檔案格式和壓縮,以及與其他 AWS 服務無縫整合。
您可以使用 和 CREATE TABLE ... USING ICEBERGCREATE TABLE ... USING ICEBERG AS SELECT命令建立分割和未分割的 Iceberg 資料表。您可以使用外部結構描述表示法 (external_schema.table_name) 或三部分表示法 () 來參考 Iceberg 資料表"catalog_name".database_name.table_name。本節中的範例示範這兩種方法。
建立資料表之後,您可以使用標準INSERT命令新增資料。請記住,雖然 Amazon Redshift 可與許多 Iceberg 資料類型搭配使用,但您可能需要在插入資訊時轉換某些資料格式。
您可以使用 SHOW TABLES命令檢視 Iceberg 資料表。如果您想要從 移除資料表 AWS Glue Data Catalog,您可以使用 DROP TABLE命令。請注意,這只會移除資料表註冊。實際資料將保留在儲存體中,直到您分別刪除為止。
您也可以使用 DELETE、 UPDATE和 MERGE命令來修改現有資料。Iceberg 資料表尚未支援所有其他 SQL 陳述式ALTER TABLE,例如 。
您可以寫入不是由 Amazon Redshift 建立的 Iceberg 資料表。不過,有一些限制:
-
資料表必須是 Iceberg v2 資料表。
-
資料表必須使用 Parquet 做為預設資料格式。
-
資料表不得將中繼資料壓縮設定為 True。
-
資料表不得啟用 Write-Audit-Publish (WAP)。
下列各節示範在 Amazon Redshift 中建立、插入、修改和管理 Iceberg 資料表的 SQL 語法。
CREATE TABLE
CREATE TABLE [IF NOT EXISTS]<external_schema>.<table_name>( column_name data_type [, ...] ) USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression_value>')]
您也可以對 S3 資料表儲存貯體使用三部分表示法:
CREATE TABLE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>( column_name data_type [, ...] ) USING ICEBERG [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression_value>')]
請注意, 必須是建立外部資料表的現有外部結構描述名稱。如需如何建立和管理外部結構描述的詳細資訊,請參閱 Amazon Redshift 文件中的 CREATE EXTERNAL SCHEMA。<external_schema>
LOCATION 子句定義此新建立 Iceberg 資料表的資料表位置。對於 Amazon S3 資料表,LOCATION無法指定 ,因為資料表位置是由 Amazon S3 資料表目錄 () 決定s3tablescatalog。
在所有其他情況下, LOCATION 是必要的,而且應該是空的位置,這表示不存在共用此相同儲存貯體和字首的現有 Amazon S3 物件。請注意,Amazon S3 儲存貯體區域必須與 Amazon Redshift 叢集位於相同的區域。
不過, AWS 提供將資料從存放在 AWS Glue Data Catalog 中的 Iceberg 資料表複寫 AWS 區域 到不同 的方法 AWS 區域,可讓您將寫入複寫到不同區域。如需詳細資訊,請參閱跨 複寫資料 AWS 區域。
PARTITIONED BY 定義 Iceberg 資料表分割區。Amazon Redshift 支援除 以外的所有 Iceberg v2 分割區轉換void。以下是支援的轉換清單:
-
身分
-
儲存貯體 【N】
-
截斷【W】
-
年
-
月
-
天
-
小時
如需這些轉換的完整定義和相容的資料類型,請參閱 Apache Iceberg 文件中的分割區轉換
PARTITIONED BY 支援多層級分割。例如,您可執行下列命令:
CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, id), year(ship_date));
不過,Amazon Redshift 不支援在多個轉換中使用單一資料欄。例如,不支援下列語法:
CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, ship_date), year(ship_date));
TABLE PROPERTIES 子句定義此 Iceberg 資料表的額外資料表屬性。我們支援的唯一資料表屬性是compression_type定義預設 Parquet 資料檔案壓縮。如果未指定,snappy則會使用 做為壓縮轉碼器。的可能值compression_type為:zstd、brotli、snappy、 gzip和 uncompressed。
注意
CREATE TABLE ... LIKE ... Iceberg 資料表不支援 。Iceberg 資料表也不支援資料欄限制條件和資料欄屬性,就像 RMS 資料表一樣。
或者,您可以使用 在單一操作中建立和填入 Iceberg 資料表CREATE TABLE AS SELECT:
CREATE TABLE AS SELECT
CREATE TABLE<external_schema>.<table_name>[( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query
您也可以使用三部分表示法,在自動掛載的目錄中建立資料表:
CREATE TABLE "<catalog_name>".<database_name>.<table_name>[( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query
這類似於 CREATE TABLE陳述式,但 後面CREATE接著一個SELECT陳述式,以將SELECT查詢結果填入資料表。
此處的 CREATE TABLE子句不再允許您指定資料類型,因為資料欄資料類型將由SELECT查詢決定。
如果SELECT查詢因任何原因失敗,此查詢將會失敗,而且不會建立 Iceberg 資料表。
您可以使用 檢視 Iceberg 資料表的結構SHOW TABLE:
SHOW TABLE
SHOW TABLE<external_schema>.<table_name>
您也可以搭配自動掛載目錄使用三部分表示法:
SHOW TABLE "<catalog_name>".<database_name>.<table_name>
SHOW TABLE 會顯示 Iceberg 資料表的 CREATE TABLE 陳述式。命令會根據資料表的類型顯示適當的結果。以下是 Iceberg 資料表SHOW TABLE輸出的範例:
CREATE TABLE my_schema.items (id int, price decimal(5, 2)) USING ICEBERG LOCATION 's3://my_s3_bucket/items/' PARTITIONED BY (bucket(16, id)) TABLE PROPERTIES ('compression_type'='snappy')
注意
對於 Amazon S3 資料表,由於資料表位置是由 Amazon S3 資料表目錄管理,SHOW TABLE因此結果中會省略 LOCATION子句。
建立資料表之後,您可以使用 新增資料INSERT INTO:
INSERT INTO
INSERT INTO<external_schema>.<table_name>[(column_name [, ...])] VALUES (...) INSERT INTO<external_schema>.<table_name>[(column_name [, ...])] (SELECT query) -- Using three-part notation for S3 table buckets: INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[(column_name [, ...])] VALUES (...) INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[(column_name [, ...])] (SELECT query)
您可以使用上述語法INSERT INTO現有的 Iceberg 資料表。如果使用 VALUES子句,您可以為 列出的資料欄提供值column_name,如果省略column_name部分,則為所有資料欄提供值。
將資料插入分割資料表時,會根據預先定義的分割區規格分佈新資料列。如果SELECT查詢因任何原因失敗,查詢將會失敗,而且不會將任何資料插入 Iceberg 資料表。
DELETE
Iceberg 資料表的DELETE查詢使用 DELETE RMS 資料表中的現有語法:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] DELETE [ FROM ]iceberg_table[ { USING }table_name, ...] [ WHEREcondition]
您也可以對 S3 資料表儲存貯體使用三部分表示法:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] DELETE [ FROM ] "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[ { USING }table_name, ...] [ WHEREcondition]
您可以使用 iceberg_table表單參考 ,或使用自動掛載目錄的 3 部分標記法。請參閱在 Amazon Redshift 中參考 Iceberg 資料表。<external_schema>.<external_table_name>
USING 子句中的 將用於與目標資料表聯結,以刪除對table_nameWHERE條件滿意的資料列。 可以是 Iceberg 資料表或 Amazon Redshift RMS 資料表。table_name
由於 Iceberg 使用隱藏分割區結構描述,因此使用者可以使用DELETE查詢來移除分割區,實現ALTER TABLE ... DROP PARTITION ...與 Hive 資料表相同的效果。
例如,當我們分割 Iceberg 資料表時,如下所示:
CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date;
然後,我們可以使用如下所示的查詢輕鬆移除分割區:
DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';
對於這類查詢,Amazon Redshift 將最佳化執行,以僅執行中繼資料操作並使執行短路。因此,與一般DELETE查詢不同,僅刪除查詢的中繼資料不會在 中顯示執行步驟EXPLAIN:
explain DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231'; QUERY PLAN ------------ "XN Seq Scan Metadata of my_external_schema.lineitem location: "s3://s3-path//table-location" format:ICEBERG (cost=0.00..0.01 rows=0 width=0)" (0 rows)
UPDATE
Iceberg 資料表的UPDATE查詢語法非常類似於 UPDATE RMS 資料表的現有語法:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] UPDATEiceberg_table[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
您也可以對 S3 資料表儲存貯體使用三部分表示法:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] UPDATE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
您可以使用 iceberg_table表單參考 ,或使用自動掛載目錄的 3 部分標記法。請參閱在 Amazon Redshift 中參考 Iceberg 資料表。<external_schema>.<external_table_name>
您可以透過參考其他資料表中的資訊更新資料表。請在 FROM 子句中列出這些其他資料表,或在 WHERE 條件中使用子查詢。來源資料表可以是 Iceberg 資料表或 Amazon Redshift RMS 資料表。
UPDATE 也可以在分割的資料表上執行。當 UPDATE變更屬於目前分割區規格的資料欄值時,新的更新資料列會根據新更新的值插入新的分割區。
例如,當我們有如下所示的分割 Iceberg 資料表時:
CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date; INSERT INTO my_external_schema.lineitem VALUES (10099, '20251231', ...);
當我們執行以下更新查詢時:
UPDATE my_external_schema.lineitem SET l_ship_date = '20260101' WHERE l_item_id = 10099;
我們將以 l_item_id 10099 將此資料列從分割區 移至20251231新的分割區 20260101。
也請務必注意,它UPDATE可能有多個候選值。請考慮以下查詢:
CREATE TABLE my_ext_schema.t1(x1 int, y1 int) USING ICEBERG LOCATION ...; CREATE TABLE my_ext_schema.t2(x2 int, y2 int) USING ICEBERG LOCATION ...; INSERT INTO my_ext_schema.t1 VALUES (1,10), (2,20), (3,30); INSERT INTO my_ext_schema.t2 VALUES (2,40), (2,50); UPDATE my_ext_schema.t1 SET y1=y2 FROM my_ext_schema.t2 WHERE x1=x2;
在此情況下,y1 可以是 40 或 50。結果為非確定性。您可以將組態參數error_on_nondeterministic_update設定為 true,以便在發生這種情況時強制查詢錯誤。這與現有的 RMS 資料表UPDATE行為一致。如需詳細資訊,請參閱 error_on_nondeterministic_update。
MERGE
MERGE 查詢會以條件將來源資料表中的資料列合併到目標資料表。它與現有的 RMS 資料表共用相同的MERGE查詢語法:
MERGE INTOtarget_iceberg_tableUSINGsource_table[ [ AS ]alias] ONmatch_condition[ WHEN MATCHED THEN { UPDATE SETcol_name= {expr} [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ (col_name[,...] ) ] VALUES ( {expr} [, ...] ) | REMOVE DUPLICATES ]
您也可以對 S3 資料表儲存貯體使用三部分表示法:
MERGE INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>USINGsource_table[ [ AS ]alias] ONmatch_condition[ WHEN MATCHED THEN { UPDATE SETcol_name= {expr} [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ (col_name[,...] ) ] VALUES ( {expr} [, ...] ) | REMOVE DUPLICATES ]
您可以使用 target_iceberg_table表單參考 ,或使用自動掛載目錄的 3 部分標記法。請參閱在 Amazon Redshift 中參考 Iceberg 資料表。<external_schema>.<external_table_name>
可以是 Iceberg 資料表或 Amazon Redshift RMS 資料表。source_table
使用 REMOVE DUPLICATES 時,MERGE命令會使用簡化模式。如需簡化模式的詳細資訊,請參閱原始MERGE命令文件。
執行MERGE查詢時,Amazon Redshift 會產生中繼資料檔案,並將其存放在目標資料表位置。這些檔案將在查詢結束時收集垃圾。因此,MERGE查詢需要 Amazon S3 儲存貯體的DELETE許可,才能正常運作。如果垃圾回收操作失敗,許可錯誤會擲回。對於 Amazon S3 資料表,垃圾回收是由 Amazon S3 資料表服務管理。因此,執行MERGE查詢不需要DELETE許可。
DROP TABLE
若要從目錄中移除 Iceberg 資料表,請使用 DROP TABLE命令:
DROP TABLE<external_schema>.<table_name>
您也可以搭配自動掛載目錄使用三部分表示法:
DROP TABLE "<catalog_name>".<database_name>.<table_name>
捨棄 Iceberg 資料表是僅限中繼資料的操作。如果這是 Amazon S3 資料表,則會從 AWS Glue Data Catalog 和 Amazon S3 資料表目錄移除資料表項目。Amazon Redshift 不會清除或刪除資料表位置下的任何現有資料檔案或中繼資料檔案。您可以使用 AWS Glue 和 Amazon S3 資料表中的功能來移除孤立的檔案。如需 AWS Glue,請參閱刪除孤立檔案。如需 Amazon S3 資料表,請參閱資料表維護。