

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# SQL 命令
<a name="iceberg-writes-sql-syntax"></a>

Amazon Redshift 中的 Apache Iceberg 資料表提供強大的方法來管理資料湖中的大型分析資料集。這些資料表支援 ACID 交易、結構描述演變和時間歷程功能，同時維持分析工作負載的高效能。使用 Apache Iceberg 資料表，您可以有效率地整理和分割資料、控制檔案格式和壓縮，以及與其他 AWS 服務無縫整合。

您可以使用 和 `CREATE TABLE ... USING ICEBERG``CREATE 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 語法。

**Contents**
+ [CREATE TABLE](#iceberg-writes-create-table)
+ [CREATE TABLE AS SELECT](#iceberg-writes-create-table-as-select)
+ [SHOW TABLE](#iceberg-writes-show-table)
+ [INSERT INTO](#iceberg-writes-insert-into)
+ [DELETE](#iceberg-writes-delete)
+ [UPDATE](#iceberg-writes-update)
+ [MERGE](#iceberg-writes-merge)
+ [DROP TABLE](#iceberg-writes-drop-table)

## CREATE TABLE
<a name="iceberg-writes-create-table"></a>

```
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>')]
```

請注意， `<external_schema>`必須是建立外部資料表的現有外部結構描述名稱。如需如何建立和管理外部結構描述的詳細資訊，請參閱 Amazon Redshift 文件中的 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

`LOCATION` 子句定義此新建立 Iceberg 資料表的資料表位置。對於 Amazon S3 資料表，`LOCATION`無法指定 ，因為資料表位置是由 Amazon S3 資料表目錄 () 決定`s3tablescatalog`。

在所有其他情況下， `LOCATION` 是必要的，而且應該是空的位置，這表示不存在共用此相同儲存貯體和字首的現有 Amazon S3 物件。請注意，Amazon S3 儲存貯體區域必須與 Amazon Redshift 叢集位於相同的區域。

不過， AWS 提供將資料從存放在 AWS Glue Data Catalog 中的 Iceberg 資料表複寫 AWS 區域 到不同 的方法 AWS 區域，可讓您將寫入複寫到不同區域。如需詳細資訊，請參閱[跨 複寫資料 AWS 區域](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/best-practices-workloads.html#workloads-replication)。

`PARTITIONED BY` 定義 Iceberg 資料表分割區。Amazon Redshift 支援除 以外的所有 Iceberg v2 分割區轉換`void`。以下是支援的轉換清單：
+ **身分**
+ **儲存貯體 【N】**
+ **截斷【W】**
+ **年**
+ **月**
+ **天**
+ **小時**

如需這些轉換的完整定義和相容的資料類型，請參閱 Apache Iceberg 文件中的[分割區轉換](https://iceberg.apache.org/spec/#partition-transforms)。

`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
<a name="iceberg-writes-create-table-as-select"></a>

```
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
<a name="iceberg-writes-show-table"></a>

```
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
<a name="iceberg-writes-insert-into"></a>

```
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
<a name="iceberg-writes-delete"></a>

Iceberg 資料表的`DELETE`查詢使用 `DELETE` RMS 資料表中的現有語法：

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] iceberg_table
[ { USING } table_name, ... ] [ WHERE condition ]
```

您也可以對 S3 資料表儲存貯體使用三部分表示法：

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>
[ { USING } table_name, ... ] [ WHERE condition ]
```

`iceberg_table` 您可以使用 `<external_schema>.<external_table_name>`表單參考 ，或使用自動掛載目錄的 3 部分標記法。請參閱[在 Amazon Redshift 中參考 Iceberg 資料表](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html)。

`USING` 子句`table_name`中的 將用於與目標資料表聯結，以刪除對`WHERE`條件滿意的資料列。`table_name` 可以是 Iceberg 資料表或 Amazon Redshift RMS 資料表。

由於 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
<a name="iceberg-writes-update"></a>

Iceberg 資料表的`UPDATE`查詢語法非常類似於 `UPDATE` RMS 資料表的現有語法：

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
UPDATE iceberg_table [ [ AS ] alias ] SET column = { expression } [,...]
[ FROM fromlist ]
[ WHERE condition ]
```

您也可以對 S3 資料表儲存貯體使用三部分表示法：

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
UPDATE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> [ [ AS ] alias ] SET column = { expression } [,...]
[ FROM fromlist ]
[ WHERE condition ]
```

`iceberg_table` 您可以使用 `<external_schema>.<external_table_name>`表單參考 ，或使用自動掛載目錄的 3 部分標記法。請參閱[在 Amazon Redshift 中參考 Iceberg 資料表](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html)。

您可以透過參考其他資料表中的資訊更新資料表。請在 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\$1on\$1nondeterministic\$1update](https://docs.aws.amazon.com/redshift/latest/dg/r_error_on_nondeterministic_update.html)。

## MERGE
<a name="iceberg-writes-merge"></a>

`MERGE` 查詢會以條件將來源資料表中的資料列合併到目標資料表。它與現有的 RMS 資料表共用相同的`MERGE`查詢語法：

```
MERGE INTO target_iceberg_table USING source_table [ [ AS ] alias ]
ON match_condition
[ WHEN MATCHED THEN { UPDATE SET col_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> USING source_table [ [ AS ] alias ]
ON match_condition
[ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE }
  WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ]
  VALUES ( { expr } [, ...] )
| REMOVE DUPLICATES ]
```

`target_iceberg_table` 您可以使用 `<external_schema>.<external_table_name>`表單參考 ，或使用自動掛載目錄的 3 部分標記法。請參閱[在 Amazon Redshift 中參考 Iceberg 資料表](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html)。

`source_table` 可以是 Iceberg 資料表或 Amazon Redshift RMS 資料表。

使用 `REMOVE DUPLICATES` 時，`MERGE`命令會使用簡化模式。如需簡化模式的詳細資訊，請參閱原始`MERGE`[命令文件](https://docs.aws.amazon.com/redshift/latest/dg/r_MERGE.html)。

執行`MERGE`查詢時，Amazon Redshift 會產生中繼資料檔案，並將其存放在目標資料表位置。這些檔案將在查詢結束時收集垃圾。因此，`MERGE`查詢需要 Amazon S3 儲存貯體的`DELETE`許可，才能正常運作。如果垃圾回收操作失敗，許可錯誤會擲回。對於 Amazon S3 資料表，垃圾回收是由 Amazon S3 資料表服務管理。因此，執行`MERGE`查詢不需要`DELETE`許可。

## DROP TABLE
<a name="iceberg-writes-drop-table"></a>

若要從目錄中移除 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，請參閱[刪除孤立檔案](https://docs.aws.amazon.com/glue/latest/dg/orphan-file-deletion.html)。如需 Amazon S3 資料表，請參閱[資料表維護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html)。