

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

# Amazon Redshift での Apache Iceberg テーブルの使用
<a name="querying-iceberg"></a>

**注記**  
 Amazon Redshift で Apache Iceberg テーブルを使用する場合に最高のパフォーマンスを実現するには、AWS Glue を使用してテーブルの列統計を生成する必要があります。詳細については、「*AWS Glue デベロッパーガイド*」の「[Iceberg テーブルの列統計の生成](https://docs.aws.amazon.com/glue/latest/dg/iceberg-generate-column-stats.html)」を参照してください。

このトピックでは、Redshift Spectrum または Redshift Serverless で Apache Iceberg 形式のテーブルを使用する方法について説明します。Apache Iceberg は、巨大な分析テーブル用の高パフォーマンス形式です。

Redshift Spectrum または Redshift Serverless を使用して、AWS Glue Data Catalogでカタログ化されている Apache Iceberg テーブルにクエリを実行できます。Apache Iceberg は、データレイク用のオープンソースのテーブル形式です。詳細については、Apache Iceberg ドキュメントで「[Apache Iceberg](https://iceberg.apache.org/)」を参照してください。

Amazon Redshift では、Apache Iceberg テーブルに対してクエリを実行する際に、トランザクションの一貫性を保ちます。Amazon Redshift を使用してクエリを実行しながら、Amazon Athena や Amazon EMR などの ACID (原子性、一貫性、分離性、持続性) 準拠のサービスを通じてテーブル内のデータを操作できます。Amazon Redshift では、Apache Iceberg メタデータに保存されているテーブル統計を使用してクエリプランを最適化し、クエリ処理中のファイルスキャンを減らすことができます。Amazon Redshift SQL を使用すると、Redshift テーブルをデータレイクテーブルと結合できます。

Amazon Redshift で Iceberg テーブルの使用を開始するには

1. Amazon Athena や Amazon EMR などの互換性のあるサービスを使用して AWS Glue Data Catalogのデータベースに Apache Iceberg テーブルを作成します。Athena を使用して Iceberg テーブルを作成するには、「Amazon Athena ユーザーガイド」の「[Apache Iceberg テーブルの使用](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg.html)」を参照してください。**

1. Amazon Redshift クラスターまたは Redshift Serverless ワークグループを作成し、データレイクへのアクセスを許可する IAM ロールを関連付けます。クラスターやワークグループの作成方法については、「*Amazon Redshift 入門ガイド*」の「[Amazon Redshift でプロビジョニングされたデータウェアハウス](https://docs.aws.amazon.com/redshift/latest/gsg/new-user.html)」と「[Amazon Redshift Serverless データウェアハウスの使用を開始](https://docs.aws.amazon.com/redshift/latest/gsg/new-user-serverless.html)」を参照してください。

1. クエリエディタ v2 またはサードパーティの SQL クライアントを使用して、クラスターまたはワークグループに接続します。クエリエディタ v2 を使用して接続する方法については、「Amazon Redshift 管理ガイド」の「[SQL クライアントツールを使用して Amazon Redshift データウェアハウスに接続する](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html)」を参照してください。**

1. Iceberg テーブルを含む特定のデータカタログデータベース用の外部スキーマを Amazon Redshift データベースに作成します。外部スキーマの作成の詳細については、「[Amazon Redshift Spectrum 用の外部スキーマ](c-spectrum-external-schemas.md)」を参照してください。

1. SQL クエリを実行して、作成した外部スキーマ内の Iceberg テーブルにアクセスします。

## Amazon Redshift で Apache Iceberg テーブルを使用する際の考慮事項
<a name="querying-iceberg-considerations"></a>

Amazon Redshift で Iceberg テーブルを使用する場合は、以下の点を考慮してください。
+ **Iceberg バージョンのサポート** — Amazon Redshift は、以下のバージョンの Iceberg テーブルに対するクエリの実行をサポートしています。
  + バージョン 1 は、イミュータブルなデータファイルを使用して、大規模な分析テーブルをどのように管理するかを定義します。
  + バージョン 2 は、行レベルの更新と削除をサポートするとともに、既存のデータファイルを変更せずに維持し、削除ファイルを使用してテーブルデータの変更を処理する機能を追加します。

   バージョン 1 とバージョン 2 のテーブルの違いについては、Apache Iceberg ドキュメントで「[フォーマットバージョンの変更](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)」を参照してください。
+ **パーティションの追加** — Apache Iceberg テーブルにパーティションを手動で追加する必要はありません。Apache Iceberg テーブルの新しいパーティションは Amazon Redshift によって自動的に検出されるため、テーブル定義のパーティションを更新するための手動操作は必要ありません。パーティション仕様の変更も、ユーザーの介入なしにクエリに自動的に適用されます。
+ **Amazon Redshift への Iceberg データのインジェスト** — INSERT INTO コマンドまたは CREATE TABLE AS コマンドを使用して、Iceberg テーブルからローカルの Amazon Redshift テーブルにデータをインポートできます。現在、COPY コマンドを使用して Apache Iceberg テーブルの内容をローカルの Amazon Redshift テーブルにインジェストすることはできません。
+ **マテリアライズドビュー** — Amazon Redshift の他の外部テーブルと同じように、Apache Iceberg テーブルでマテリアライズドビューを作成できます。他のデータレイクテーブル形式の場合と同じ考慮事項が Apache Iceberg テーブルにも当てはまります。データレイクテーブルの自動クエリ書き換え、自動マテリアライズドビューは現在サポートされていません。
+ **AWS Lake Formation のきめ細かなアクセス制御** — Amazon Redshift は、Apache Iceberg テーブルに対する AWS Lake Formation のきめ細かなアクセス制御をサポートしています。
+ **ユーザー定義のデータ処理パラメータ** — Amazon Redshift は、Apache Iceberg テーブルに対するユーザー定義のデータ処理パラメータをサポートしています。既存のファイルに対するユーザー定義のデータ処理パラメータを使用して、外部テーブルでクエリされるデータを調整し、スキャンエラーを回避します。これらのパラメータは、テーブルスキーマとファイル内の実際のデータとの不一致を処理する機能を提供します。Apache Iceberg テーブルに対してもユーザー定義のデータ処理パラメータを使用できます。
+ **タイムトラベルクエリ** — タイムトラベルクエリは現在、Apache Iceberg テーブルに対してサポートされていません。
+ **料金** — クラスターから Iceberg テーブルにアクセスすると、Redshift Spectrum の料金が請求されます。ワークグループから Iceberg テーブルにアクセスすると、Redshift Serverless の料金が請求されます。Redshift Spectrum と Redshift Serverless の料金の詳細については、「[Amazon Redshift の料金](https://aws.amazon.com/redshift/pricing/)」を参照してください。
+ **メタデータキャッシュ** – メタデータキャッシュは、[Iceberg 仕様](https://iceberg.apache.org/spec/#file-system-operations)に基づき、メタデータファイルが変更不可能であることを前提としています。メタデータファイルのイミュータビリティは、Amazon Redshift のデータ整合性の要件です。
+ **フェデレーティッド ID** – Apache Iceberg テーブルに書き込む場合、フェデレーティッド ID はサポートされていません。これには、外部スキーマの作成時に IAM\$1ROLE パラメータに SESSION キーワードを使用することが含まれます。IAM\$1ROLE パラメータの詳細については、「[CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)」を参照してください。

# Apache Iceberg テーブルでサポートされているデータ型
<a name="querying-iceberg-supported-data-types"></a>

このトピックでは、Redshift Spectrum が Apache Iceberg 形式のテーブルから読み取ることができるサポートされているデータ型について説明します。

Amazon Redshift は、以下のデータ型が含まれている Iceberg テーブルをクエリできます。

```
binary
boolean
date
decimal
double
float
int
list
long
map
string
struct
timestamp without time zone
```

Iceberg テーブルを作成して定義するときは、SQL ステートメントで Amazon Redshift データ型名を使用します。Redshift は、対応する Iceberg タイプに自動的にマッピングします。Iceberg のデータ型の詳細については、Apache Iceberg ドキュメントで [Iceberg のスキーマ](https://iceberg.apache.org/docs/latest/schemas/)を参照してください。

Iceberg テーブルから読み取ると、Iceberg データ型は、次の表に示すように Redshift データ型にマッピングされます。


****  

| Iceberg の型 | Amazon Redshift の型 | 注意事項 | 
| --- | --- | --- | 
| boolean | boolean | - | 
| - | tinyint | Iceberg テーブルではサポートされていません。 | 
| - | smallint | Iceberg テーブルではサポートされていません。 | 
| int | int | - | 
| long | bigint | - | 
| double | double precision | - | 
| float | real | - | 
| decimal(P, S) | decimal(P, S) | P は精度、S はスケールです。 | 
| - | char | Iceberg テーブルではサポートされていません。 | 
| string | varchar(16384) | 16384 より大きい文字列は 16384 に切り詰められます。 | 
| binary | varbyte(64000) | - | 
| date | date | - | 
| time | - | - | 
| timestamp | timestamp | - | 
| timestamptz | timestampz | - | 
| list<E> | SUPER | - | 
| map<K,V> | SUPER | - | 
| struct<...> | SUPER | - | 
| fixed(L) | - | 現在、fixed(L) 型は Redshift Spectrum ではサポートされていません。 | 
| uuid | - | 現在、uuid 型は Redshift Spectrum ではサポートされていません。 | 
| variant | - | Amazon Redshift は Iceberg V3 をサポートしていません。 | 
| geometry | - | Amazon Redshift は Iceberg V3 をサポートしていません。 | 
| geography | - | Amazon Redshift は Iceberg V3 をサポートしていません。 | 
| timestamp\$1ns | - | Amazon Redshift は Iceberg V3 をサポートしていません。 | 
| timestamptz\$1ns | - | Amazon Redshift は Iceberg V3 をサポートしていません。 | 
| Unknown | - | Amazon Redshift は Iceberg V3 をサポートしていません。 | 

Redshift から Iceberg テーブルを作成する場合、次のデータ型がサポートされています。Redshift データ型は、次の表に示すように Iceberg データ型にマッピングされます。


****  

| Amazon Redshift の型 | Amazon Redshift エイリアス | Iceberg の型 | 注意事項 | 
| --- | --- | --- | --- | 
| integer | int, int4 | int | - | 
| bigint | int8 | long | - | 
| decimal | numeric | decimal(p,S) | - | 
| real | float4 | float | - | 
| double precision | float8, float | double | - | 
| varchar | charactter varying,nvarchar, text | string | Iceberg テーブルを作成する場合、varchar(n) データ型はサポートされていません。 | 
| date | - | date | - | 
| timestamp | - | timestamp | - | 
| timestamptz | - | timestamptz | - | 
| boolean | - | boolean | - | 

Iceberg テーブルに書き込む場合、前の表で説明したデータ型に加えて、次の表に示すように、一部のソースデータ型は互換性のある Iceberg 型に昇格されます。


| Amazon Redshift の型 | Iceberg の型 | 
| --- | --- | 
|  `tinyint`  |  `int`  | 
|  `smallint`  |  `int`  | 
|  `varchar(n)`  |  `string`  | 

サポートされていないデータ型を使用しようとすると、構文エラーが発生します。`CREATE TABLE AS SELECT` 句を使用して Iceberg テーブルを作成するときに、明示的なキャストを追加して型の違いを回避できます。

例えば、以下のスキーマを含む Redshift RMS table があるとします。

```
CREATE TABLE rms_t (c1 int, c2 char(20));
```

`rms_t` をソースとして使用して Iceberg テーブルを作成する場合は、`varchar(n)` タイプがサポートされていないため、`c2` 列の明示的なキャストが必要です。

```
CREATE TABLE ext_schema.iceberg_t AS SELECT c1, c2::varchar FROM rms_t;
```

Amazon Redshift のデータ型の詳細については、「[データ型](c_Supported_data_types.md)」を参照してください。

# Amazon Redshift での Iceberg テーブルの参照
<a name="referencing-iceberg-tables"></a>

Amazon Redshift には、データレイクに保存されている Apache Iceberg テーブルを参照する複数の方法が用意されています。外部スキーマを使用して Iceberg テーブルを含む Data Catalog データベースへの参照を作成することも、自動マウントカタログへの直接アクセスに 3 つの部分からなる表記を使用することもできます。

## 外部スキーマを使用して Iceberg テーブルを参照する
<a name="referencing-iceberg-external-schemas"></a>

外部スキーマは、Amazon Redshift 内からデータカタログ内のテーブルを参照する方法を提供します。外部スキーマを作成するときは、Amazon Redshift データベースと Iceberg テーブルを含む特定の Data Catalog データベース間の接続を確立します。

Iceberg テーブルの外部スキーマを作成するには

```
CREATE EXTERNAL SCHEMA schema_name
FROM DATA CATALOG
DATABASE 'glue_database_name'
IAM_ROLE 'arn:aws:iam::account-id:role/role-name';
```

外部スキーマを作成したら、2 つの部分からなる表記を使用して Iceberg テーブルをクエリできます。

```
SELECT * FROM schema_name.iceberg_table_name;
```

Iceberg テーブルをローカル Amazon Redshift テーブルと結合することもできます。

```
SELECT r.customer_id, i.order_date, r.customer_name
FROM local_customers r
JOIN schema_name.iceberg_orders i 
ON r.customer_id = i.customer_id;
```

## 自動マウントカタログでの 3 つの部分からなる表記の使用
<a name="referencing-iceberg-three-part-notation"></a>

3 つの部分からなる表記では、外部スキーマを作成することなく、自動マウントカタログ内のテーブルを直接参照できます。この方法は、AWS Lake Formation とフェデレーションされた Amazon S3 テーブルバケットを使用する場合に特に便利です。データカタログの自動マウントの設定については、「[AWS Glue Data Catalog の自動マウントを使用した Amazon Redshift での外部オブジェクトアクセスの簡素化](https://aws.amazon.com/blogs/big-data/simplify-external-object-access-in-amazon-redshift-using-automatic-mounting-of-the-aws-glue-data-catalog/)」を参照してください。

3 つの部分からなる表記の構文は次のとおりです。

```
"catalog_name".database_name.table_name
```

例えば、自動マウントされた Amazon S3 テーブルカタログで Iceberg テーブルをクエリするには

```
SELECT * FROM "my_table_bucket@s3tablescatalog".my_database.my_iceberg_table;
```

Amazon S3 テーブルバケットと Amazon Redshift の統合の詳細については、「*Amazon S3 ユーザーガイド*」の「[S3 テーブルと Amazon Redshift の統合](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-redshift.html)」を参照してください。

`USE` ステートメントを使用して、デフォルトのカタログとデータベースを設定することもできます。

```
USE "my_table_bucket@s3tablescatalog".my_database;
SELECT * FROM my_iceberg_table;
```

スキーマ解決の検索パスを設定するには

```
USE "my_table_bucket@s3tablescatalog";
SET search_path TO my_database;
SELECT * FROM my_iceberg_table;
```

## Iceberg テーブルを参照するためのベストプラクティス
<a name="referencing-iceberg-best-practices"></a>

Amazon Redshift で Iceberg テーブルを参照するときは、次のベストプラクティスを考慮してください。
+ **わかりやすいスキーマ名を使用する** – 外部スキーマを作成するときは、`sales_data_lake` や `customer_analytics` など、データのソースと目的を明確に示す名前を使用します。
+ **テーブル統計を活用する** – AWS Glue を使用してクエリパフォーマンスを最適化し、Iceberg テーブルの列統計が生成されていることを確認します。Amazon Redshift は、クエリの計画と最適化にこれらの統計を使用します。
+ **データの鮮度を考慮する** – Iceberg テーブルは、クエリ中に他のサービスによって更新される可能性があります。Amazon Redshift はトランザクションの整合性を提供し、クエリの実行中にデータの整合性のあるスナップショットを確認できるようにします。
+ **適切な IAM アクセス許可を使用する** – Amazon Redshift クラスターまたはワークグループに、Iceberg テーブルが保存されている Amazon S3 の場所と Data Catalog メタデータにアクセスするために必要な IAM アクセス許可があることを確認します。
+ **クエリパフォーマンスのモニタリング** – Amazon Redshift クエリモニタリング機能を使用して、Iceberg テーブルに対するクエリのパフォーマンスを追跡し、必要に応じて最適化します。

## 一般的な参照パターン
<a name="referencing-iceberg-examples"></a>

次の例は、Iceberg テーブルを参照するための一般的なパターンを示しています。

**複数の Iceberg テーブル間でのデータの集約**

```
SELECT 
    region,
    SUM(sales_amount) as total_sales,
    COUNT(*) as transaction_count
FROM data_lake.sales_transactions
WHERE transaction_date >= '2024-01-01'
GROUP BY region
ORDER BY total_sales DESC;
```

**Iceberg テーブルとローカル Amazon Redshift テーブルの結合**

```
SELECT 
    c.customer_name,
    c.customer_tier,
    SUM(o.order_amount) as total_orders
FROM customers c
JOIN data_lake.order_history o ON c.customer_id = o.customer_id
WHERE o.order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY c.customer_name, c.customer_tier;
```

**複雑なクエリでの 3 つの部分からなる表記の使用**

```
WITH recent_orders AS (
    SELECT customer_id, order_date, order_amount
    FROM "analytics_bucket@s3tablescatalog".ecommerce.orders
    WHERE order_date >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT 
    customer_id,
    COUNT(*) as order_count,
    AVG(order_amount) as avg_order_value
FROM recent_orders
GROUP BY customer_id
HAVING COUNT(*) > 1;
```

# Apache Iceberg テーブルへの書き込み
<a name="iceberg-writes"></a>

Amazon Redshift では、Amazon S3 および Amazon S3 テーブルバケットに保存されている Apache Iceberg テーブルを作成して書き込むことができます。Amazon Redshift から直接 Iceberg データを書き込むと、追加のツールがなくなるため、データ管理が効率化されます。Iceberg テーブルは AWS Glue Data Catalog に登録する必要があります。

Apache Iceberg テーブルでレイクハウスアーキテクチャを使用しながら、ウェアハウスとレイクの両方で Amazon Redshift の強力な SQL 分析を活用できます。また、Iceberg テーブルのマテリアライズドビューなどの高度な Amazon Redshift 機能にすぐにアクセスできるため、分析機能が複雑になることなく大幅に強化されます。

Iceberg の書き込みは、Amazon Redshift でプロビジョニングされたクラスターと Amazon Redshift Serverless インスタンスの両方でサポートされています。

**Topics**
+ [

# SQL コマンド
](iceberg-writes-sql-syntax.md)
+ [

# トランザクションセマンティクス
](iceberg-writes-transaction-semantics.md)
+ [

# ベストプラクティス
](iceberg-writes-best-practices.md)

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

# トランザクションセマンティクス
<a name="iceberg-writes-transaction-semantics"></a>

Redshift Iceberg 書き込みクエリは、ACID とスナップショットの分離をサポートします。書き込みトランザクションはアトミック性が保証されており、クエリが予期せず失敗しても部分的な更新は生成されません。

複数の Iceberg トランザクションを同時に実行でき、2 つのトランザクションが同じテーブルまたはパーティションを同時に変更しようとすると、トランザクションコミットは失敗します。これにより、データの整合性が確保されます。この場合、競合を手動で解決し、失敗したクエリを再実行する必要があります。Amazon Redshift は、競合を自動的に再試行して解決しません。

単一の Iceberg 書き込みクエリは常に単一の自動コミットトランザクションとして扱われます。CREATE クエリや INSERT クエリなどの Iceberg 書き込みクエリが明示的なトランザクションブロックに含まれている場合、同じトランザクションブロック内で他のクエリを実行することはできません。トランザクションは失敗します。

次に例をいくつか示します。最初の例は、単一のステートメントクエリがクエリの完了後に常に自動コミットすることを示しています。このシナリオでは、新しい受注テーブルを作成します。

```
CREATE TABLE sales_schema.orders (
    order_id int, 
    customer_id int, 
    order_date date, 
    total_amount decimal(10,2)
) USING ICEBERG LOCATION 's3://my-data-lake/sales/orders/';
```

この例は、S3 テーブルバケットの 3 つの部分からなる表記を使用して顧客注文を挿入するための明示的なトランザクションブロックです。トランザクションは INSERT クエリの後に自動コミットしませんが、代わりに COMMIT コマンドを使用して注文データをコミットして挿入します。

```
BEGIN;
INSERT INTO "analytics_bucket@s3tablescatalog".sales_db.orders VALUES (12345, 9876, '2024-10-30', 299.99);
COMMIT;
```

この例は、明示的なトランザクションブロックのロールバックシナリオで、注文挿入をテストしているが、キャンセルすることを決定しています。トランザクションは INSERT クエリの後に自動コミットしませんが、代わりにテスト注文を挿入せずに ROLLBACK コマンドでロールバックします。

```
BEGIN;
INSERT INTO sales_schema.orders VALUES (12346, 5432, '2024-10-30', 150.75);
ROLLBACK;
```

この最後の例は、INSERT クエリと同じトランザクションブロック内で別のステートメントを実行しようとすると、注文データを挿入せずにトランザクションが失敗する様子を示しています。このシナリオでは、注文を挿入し、すぐにテーブルにクエリを実行しようとしています。

```
BEGIN;
INSERT INTO sales_schema.orders VALUES (12347, 7890, '2024-10-30', 425.50);
SELECT * FROM sales_schema.orders WHERE order_id = 12347;
```

この唯一の例外は `DROP TABLE` ステートメントです。これは常に自動コミットステートメントとして動作し、明示的なトランザクションブロック内で実行することはできません。これは、外部テーブルの `DROP TABLE` と同じ動作を維持するためです。詳細については、「[DROP TABLE](https://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html)」を参照してください。

**注記**  
Iceberg 書き込み SQL は、ストアドプロシージャ内から実行することはできません。

# ベストプラクティス
<a name="iceberg-writes-best-practices"></a>

Apache Iceberg テーブルに書き込むときは、次のベストプラクティスを考慮してください。
+ 小規模で頻繁な書き込みまたはストリーミングワークロードの場合は、AWS Glue Data Catalog または Amazon S3 テーブルが提供する圧縮機能を使用して読み取りのファイルサイズを最適化することを検討してください。
+ `DROP TABLE` コマンドは、AWS Glue Data Catalog または Amazon S3 テーブルカタログからテーブルを登録解除しますが、ファイルは残ります。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)」を参照してください。