View a markdown version of this page

SQL コマンド - Amazon Redshift

Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、ブログ記事を参照してください。

SQL コマンド

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 コマンドを使用できます。これにより、テーブル登録のみが削除されます。実際のデータは、別個に削除するまでストレージに保持されます。

既存のデータは、DELETEUPDATE、および MERGE コマンドを使用して変更することもできます。スキーマ、パーティション仕様、プロパティなどのテーブル定義を変更するには、「テーブル定義の変更」を参照してください。文書化されていない他の DDL ステートメントは、Iceberg テーブルではサポートされていません。

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 テーブルバケットには 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>')]

自動マウントルートカタログ awsdatacatalog の場合:

CREATE TABLE awsdatacatalog.<database_name>.<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>')]

外部スキーマ構文を使用する際、<external_schema> は、外部テーブルを作成する既存の外部スキーマ名である必要があります。外部スキーマを作成および管理する方法の詳細については、Amazon Redshift ドキュメントの「CREATE EXTERNAL SCHEMA」を参照してください。

LOCATION 句は、新しく作成された Iceberg テーブルのテーブルの場所を定義します。LOCATION は、外部スキーマまたは awsdatacatalog ルートカタログを使用して作成されたテーブルに必要です。これは空の場所である必要があります。つまり、この同じバケットとプレフィックスを共有する既存の Amazon S3 オブジェクトはありません。Amazon S3 バケットリージョンが、Amazon Redshift クラスターと同じリージョンに存在する必要があります。Amazon S3 テーブルバケットの場合、テーブルの場所は Amazon S3 Tables カタログ (s3tablescatalog) によって決定されるため、LOCATION を指定することはできません。

ただし、AWS には、AWS Glue Data Catalog に保存されている Iceberg テーブルからデータをある AWS リージョンから別の AWS リージョンにレプリケートする方法が用意されているため、書き込みを別のリージョンにレプリケートできます。詳細については、「AWS リージョン間でデータをレプリケートする」を参照してください。

PARTITIONED BY は Iceberg テーブルパーティションを定義します。Amazon Redshift は、void を除くすべての Iceberg v2 パーティション変換をサポートしています。サポートされている変換のリストを次に示します。

  • identity

  • bucket[N]

  • truncate[W]

  • year

  • month

  • day

  • hour

これらの変換の詳しい定義および互換性のあるデータ型については、Apache Iceberg ドキュメントの「パーティション変換」を参照してください。

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 の想定される値は、zstdbrotligzipsnappyuncompressed です。

注記

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

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

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

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 テーブルの構造を表示できます。

テーブルを表示する

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

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) -- Using three-part notation for the awsdatacatalog root catalog: INSERT INTO awsdatacatalog.<database_name>.<table_name> [(column_name [, ...])] VALUES (...) INSERT INTO awsdatacatalog.<database_name>.<table_name> [(column_name [, ...])] (SELECT query)

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

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

DELETE

Iceberg テーブルの DELETE クエリは、RMS テーブル内の既存の DELETE 構文を使用します。

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

S3 テーブルバケットには 3 つの部分からなる表記を使用することもできます。

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

自動マウントルートカタログ awsdatacatalog の場合:

[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ] DELETE [ FROM ] awsdatacatalog.<database_name>.<table_name> [ { USING } table_name, ... ] [ WHERE condition ]

<external_schema>.<external_table_name> は、iceberg_table フォームを使用して参照することも、自動マウントカタログの 3 つの部分からなる表記を使用することもできます。「Amazon Redshift での Iceberg テーブルの参照」を参照してください。

USING 句の table_name は、WHERE 条件を満たす行を削除するために、ターゲットテーブルとの結合に使用されます。table_name は、Iceberg テーブルまたは Amazon Redshift RMS テーブルにすることができます。

Iceberg は隠しパーティションスキームを使用するため、ユーザーは DELETE クエリを使用してパーティションを削除できます。これにより、Hive テーブルの ALTER TABLE ... DROP PARTITION ... と同じ効果が得られます。

例えば、次のようなパーティション分割された 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 クエリ構文は、RMS テーブルの既存の UPDATE 構文と非常によく似ています。

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

S3 テーブルバケットには 3 つの部分からなる表記を使用することもできます。

[ 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 ]

自動マウントルートカタログ awsdatacatalog の場合:

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

<external_schema>.<external_table_name> は、iceberg_table フォームを使用して参照することも、自動マウントカタログの 3 つの部分からなる表記を使用することもできます。「Amazon Redshift での Iceberg テーブルの参照」を参照してください。

他のテーブルの情報を参照することで、テーブルを更新できます。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 クエリを実行します。

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 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 テーブルバケットには 3 つの部分からなる表記を使用することもできます。

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 ]

自動マウントルートカタログ awsdatacatalog の場合:

MERGE INTO awsdatacatalog.<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 ]

<external_schema>.<external_table_name> は、target_iceberg_table フォームを使用して参照することも、自動マウントカタログの 3 つの部分からなる表記を使用することもできます。「Amazon Redshift での Iceberg テーブルの参照」を参照してください。

source_table は Iceberg テーブルまたは Amazon Redshift RMS テーブルのいずれかです。

REMOVE DUPLICATES を使用する場合、MERGE コマンドは簡易モードを使用します。簡易モードの詳細については、元の MERGE コマンドドキュメントを参照してください。

MERGE クエリの実行中に、Amazon Redshift は中間データファイルを生成し、ターゲットテーブルの場所に保存します。これらのファイルは、クエリ終了時にガベージコレクションされます。このため、MERGE クエリを適切に動作させるには、Amazon S3 バケットに対する DELETE アクセス許可が必要です。ガベージコレクションオペレーションが失敗すると、アクセス許可不足エラーがスローされます。Amazon S3 テーブルの場合、ガベージコレクションは Amazon S3 Tables サービスによって管理されます。したがって、MERGE クエリを実行するのに DELETE アクセス許可は必要ありません。

DROP TABLE

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

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 については、「孤立ファイルの削除」を参照してください。Amazon S3 テーブルについては、「テーブルのメンテナンス」を参照してください。