

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の 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 テーブルとパーティション分割されていない Iceberg テーブルを作成できます。Iceberg テーブルは、外部スキーマ表記 (`external_schema.table_name`) または 3 つの部分からなる表記 (`"catalog_name".database_name.table_name`) を使用して参照できます。このセクションの例は、両方の方法を示しています。

テーブルを作成したら、標準 `INSERT` コマンドを使用してデータを追加できます。Amazon Redshift は多くの Iceberg データ型で動作しますが、情報を挿入するときに一部のデータ形式を変換する必要がある場合があります。

`SHOW TABLES` コマンドを使用して Iceberg テーブルを表示できます。AWS Glue Data Catalog からテーブルを削除する場合は、`DROP TABLE` コマンドを使用できます。これにより、テーブル登録のみが削除されます。実際のデータは、別個に削除するまでストレージに保持されます。

`DELETE`、`UPDATE`、`MERGE`、`ALTER TABLE` などの他のすべての SQL ステートメントは、Iceberg テーブルではまだサポートされていません。

以下のセクションでは、Amazon Redshift で Iceberg テーブルを作成、挿入、管理するための SQL 構文を示します。

**Contents**
+ [CREATE TABLE](#iceberg-writes-create-table)
+ [CREATE TABLE AS SELECT](#iceberg-writes-create-table-as-select)
+ [テーブルを表示する](#iceberg-writes-show-table)
+ [INSERT INTO](#iceberg-writes-insert-into)
+ [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 テーブルバケットには 3 つの部分からなる表記を使用することもできます。

```
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 Tables の場合、テーブルの場所は Amazon S3 Tables カタログ (`s3tablescatalog`) によって決定されるため、`LOCATION` を指定することはできません。

それ以外の場合、`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 は、`void` を除くすべての Iceberg v2 パーティション変換をサポートしています。サポートされている変換のリストを次に示します。
+ **identity**
+ **bucket[N]**
+ **truncate[W]**
+ **year**
+ **month**
+ **day**
+ **hour**

これらの変換の詳しい定義および互換性のあるデータ型については、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 は複数の変換で 1 つの列を使用することをサポートしていません。例えば、次の構文はサポートされていません。

```
CREATE TABLE ...
USING ICEBERG
LOCATION ...
PARTITIONED BY (bucket(16, ship_date), year(ship_date));
```

`TABLE PROPERTIES` 句は、この Iceberg テーブルの追加のテーブルプロパティを定義します。サポートされる唯一のテーブルプロパティは、デフォルトの Parquet データファイル圧縮を定義する `compression_type` です。これを指定しない場合、`snappy` は圧縮コーデックとして使用されます。`compression_type` の想定される値は、`zstd`、`brotli`、`gzip`、`snappy`、`uncompressed` です。

**注記**  
`CREATE TABLE ... LIKE ...` は Iceberg テーブルではサポートされていません。Iceberg テーブルは、RMS テーブルにあるような列の制約や列属性もサポートしていません。

または、`CREATE TABLE AS SELECT` を使用して 1 回の操作で Iceberg テーブルを作成して入力することもできます。

## 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
```

3 つの部分からなる表記を使用して、自動マウントカタログにテーブルを作成することもできます。

```
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` の後に `SELECT` ステートメントが `SELECT` クエリ結果をテーブルに入力することを除いて、`CREATE TABLE` ステートメントに似ています。

ここでの `CREATE TABLE` 句では、列のデータ型が `SELECT` クエリによって決定されるため、データ型を指定できなくなりました。

何らかの理由で `SELECT` クエリが失敗した場合、このクエリは失敗し、Iceberg テーブルは作成されません。

`SHOW TABLE` を使用して Iceberg テーブルの構造を表示できます。

## テーブルを表示する
<a name="iceberg-writes-show-table"></a>

```
SHOW TABLE <external_schema>.<table_name>
```

自動マウントカタログでは、3 つの部分からなる表記を使用することもできます。

```
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 テーブルカタログによって管理されるため、`LOCATION` 句は `SHOW TABLE` の結果では省略されます。

テーブルを作成したら、`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)
```

上記の構文を使用して、既存の Iceberg テーブルに挿入 (`INSERT INTO`) できます。`VALUES` 句を使用する場合で、`column_name` 部が省略されている場合、`column_name` またはすべての列でリストされている列の値を指定します。

データがパーティション分割されたテーブルに挿入されると、事前定義されたパーティション仕様に従って新しい行が分散されます。何らかの理由で `SELECT` クエリが失敗した場合、クエリは失敗し、データは Iceberg テーブルに挿入されません。

Amazon Redshift によって作成されていない Iceberg テーブルに `INSERT INTO` を使用することは可能です。ただし、いくつかの制限があります。
+ テーブルは Iceberg v2 テーブルである必要があります。
+ テーブルは、デフォルトのデータ形式として Parquet を使用している必要があります。
+ テーブルでメタデータ圧縮が True に設定されていないことが必要です。
+ テーブルで Write-Audit-Publish (WAP) が有効にされていないことが必要です。

カタログから Iceberg テーブルを削除するには、`DROP TABLE` コマンドを使用します。

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

```
DROP TABLE <external_schema>.<table_name>
```

自動マウントカタログでは、3 つの部分からなる表記を使用することもできます。

```
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)」を参照してください。