View a markdown version of this page

Amazon Redshift における Apache Iceberg v3 の機能 - Amazon Redshift

Amazon Redshift は、2026 年 6 月 30 日以降、Python UDF の使用をサポートしなくなります。これは段階的に実施されます。Python のサポート終了と移行オプションの詳細については、2025 年 6 月 30 日に公開されたブログ記事を参照してください。

Amazon Redshift における Apache Iceberg v3 の機能

Amazon Redshift は Apache Iceberg v3 テーブルをサポートしています。Iceberg v3 では、デフォルトの列値、行リネージュ追跡、削除ベクトルが導入されています。新しい v3 テーブルを作成したり、既存の v2 テーブルを v3 にアップグレードしたりできます。

Iceberg v3 テーブルは、クエリと DML オペレーション (INSERT、DELETE、UPDATE、MERGE) に v2 テーブルと同じ SQL 構文を使用します。このページで説明する機能は、Iceberg v3 に固有のものです。

Iceberg v3 テーブルの作成

Iceberg v3 テーブルを作成するには、TABLE PROPERTIES 句で 'format-version'='3' を指定します。

CREATE TABLE external_schema.table_name ( column_name data_type [DEFAULT literal_value] [, ...] ) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/' [PARTITIONED BY [[column_name | transform_function]], ...] TABLE PROPERTIES ('format-version'='3' [, 'compression_type'='compression_value']);

例:

CREATE TABLE my_schema.orders ( id int, status varchar DEFAULT 'pending', priority int DEFAULT 0 ) USING ICEBERG LOCATION 's3://amzn-s3-demo-bucket/orders/' TABLE PROPERTIES ('format-version'='3');

format-version を指定しない場合、Amazon Redshift は Iceberg v2 としてテーブルを作成します。

v2 から v3 へのアップグレード

既存の Iceberg v2 テーブルを v3 にアップグレードできます。

ALTER TABLE iceberg_table SET TABLE PROPERTIES ('format-version' = '3');

形式バージョンのアップグレードは、メタデータのみのオペレーションです。既存のデータファイルは書き換えられません。既存の v2 位置削除ファイルは引き続き有効であり、読み取り時に適用されます。アップグレード後の最初の書き込みオペレーションで、テーブル全体の行リネージュ値が生成されます。以降の DELETE、UPDATE、または MERGE オペレーションでは、Amazon Redshift は v2 の位置削除を、そのオペレーションの影響を受けるデータファイルの削除ベクトルにマージします。

重要

Iceberg v3 にアップグレードする前に、「制限事項」セクションを確認してください。v3 テーブルでは一部の機能がまだサポートされていません。v3 から v2 へのダウングレードはサポートされていないため、アップグレードを進める前に、サポートされていない機能がワークロードに影響しないことを確認してください。

制限事項

  • Iceberg v3 は、Amazon Redshift Serverless クラスター (4 RPU クラスターを除く) と、RG インスタンスタイプを使用するプロビジョニングされたクラスターでのみ使用できます。

  • Iceberg v3 テーブルでは、複雑な型 (struct、list、map、variant) の読み取りおよび書き込みはできません。

  • Iceberg v3 テーブルでは、struct、list、map、variant、geometry、geography、binary、uuid、time、timestamp_ns、timestamptz_ns、unknown のデータ型は使用できません。

  • 等価削除を含む Iceberg v3 テーブルは使用できません。

  • Iceberg v3 テーブルではマテリアライズドビューを作成できません。

  • テーブルを v3 にアップグレードすると、Iceberg の timestamptz 型は、v2 で使用されていた TIMESTAMP 型ではなく、Amazon Redshift の TIMESTAMPTZ 型にマッピングされます。その結果、クエリはタイムゾーン情報を含むタイムスタンプを返します。

デフォルトの列値

デフォルトの列値は Iceberg v3 のテーブルでのみサポートされています。Iceberg v2 のテーブルでデフォルト値を指定すると、Amazon Redshift はエラーを返します。

デフォルト値は、明示的な値が存在しない場合に列がフォールバックするリテラル値を指定します。これにより、データファイルを書き換えることなく、既存のテーブルに新しい列を追加できます。以前に書き込まれたデータファイルを読み取ると、新しい列のデフォルト値が自動的に返されます。DML ステートメントで列が省略された場合、または値として DEFAULT が指定された場合も、デフォルト値が書き込まれます。

デフォルトとしてサポートされているのはリテラル値のみです。ネストされたデータ型はデフォルト値をサポートしていません。

CREATE TABLE AS SELECT は、ソーステーブルからデフォルトの列値を継承しません。新しいテーブルのデフォルトを定義するには、作成後に ALTER TABLE ALTER COLUMN SET DEFAULT を使用します。

テーブル作成時のデフォルトの定義

CREATE TABLE external_schema.table_name ( column_name data_type DEFAULT literal_value [, ...] ) USING ICEBERG LOCATION '...' TABLE PROPERTIES ('format-version'='3');

デフォルト値を持つ列の追加

ALTER TABLE iceberg_table ADD COLUMN column_name data_type DEFAULT literal_value;

既存のデータファイルは、データの書き換えを必要とせずに、新しく追加された列のデフォルト値を返します。

デフォルトの変更または削除

ALTER TABLE iceberg_table ALTER COLUMN column_name SET DEFAULT literal_value; ALTER TABLE iceberg_table ALTER COLUMN column_name DROP DEFAULT;

SET DEFAULT は、既存の列のデフォルト値を変更します。新しいデフォルト値は、変更後に書き込まれたデータファイルに適用されます。既存のデータファイルは引き続き以前のデフォルトを使用します。

DROP DEFAULT は列からデフォルト値を削除します。このオペレーションの後、新しい書き込みは列にデフォルトを適用しなくなります。列を含まないデータファイルは、列の初期デフォルト値を引き続き返します。

INSERT の動作

デフォルト値を持つ列を指定せずに行を挿入すると、デフォルト値がデータファイルに書き込まれます。

SHOW TABLE

SHOW TABLE は出力にデフォルト値を表示します。

行リネージュ

行リネージュは Iceberg v3 テーブルでのみサポートされています。行 ID と変更履歴を追跡する 2 つの疑似列を提供します。これらの列は Amazon Redshift によって自動的に管理されるため、値は設定する必要はありません。

擬似列

列 データ型 説明
_row_id BIGINT テーブル内の各行を一意に識別します。書き込みオペレーション時に自動的に割り当てられます。
_last_updated_sequence_number BIGINT 行を変更した最後の書き込みオペレーションのスナップショットシーケンス番号。

行リネージュのクエリ

行リネージュの列は、SELECT リストで明示的に指定する必要があります。SELECT * には含まれません。

SELECT _row_id, _last_updated_sequence_number, * FROM my_schema.my_iceberg_v3_table;

行リネージュの列は、WHERE、ORDER BY、GROUP BY、JOIN の各句で使用できます。

SELECT * FROM my_schema.my_iceberg_v3_table WHERE _last_updated_sequence_number >= 3 ORDER BY _row_id;

v3 以外のテーブルでの動作

Iceberg v3 以外のテーブルをクエリすると、_row_id と _last_updated_sequence_number は NULL を返します。

v2 から v3 へのアップグレード後の動作

Iceberg v2 から v3 にアップグレードしたテーブルの場合、アップグレード前のデータでは行リネージュ値をすぐには利用できません。_row_id と _last_updated_sequence_number はどちらも、アップグレード後の最初の書き込みオペレーションが実行されるまで NULL を返します。これにより、テーブル全体の行リネージュ値が生成されます。これはメタデータのみのオペレーションであり、既存のデータファイルは書き換えられません。

書き込み動作

行リネージュは、すべての書き込みオペレーション (INSERT、CTAS、UPDATE、MERGE) で Amazon Redshift によって自動的に入力されます。各行は一意の _row_id を受け取り、その行を書き込んだコミットのスナップショットシーケンス番号が _last_updated_sequence_number に反映されます。

制限事項

  • 行リネージュの列は SELECT * に含まれていません。

  • 行リネージュは Iceberg v2 以前のテーブルではサポートされていません。

  • v2 から v3 にアップグレードしたテーブルのアップグレード前のデータは、アップグレード後の最初の書き込みオペレーションまで、両方の擬似列に対して NULL を返します。

削除ベクトル

削除ベクトルは、Iceberg v3 が行レベルの削除を追跡するために使用するメカニズムです。Iceberg v2 で使用されていた位置削除ファイルに代わるものです。

Iceberg v3 テーブルで DELETE、UPDATE、または MERGE を実行すると、Amazon Redshift は削除された行の位置を削除ベクトルに記録します (個別の位置削除ファイルは書き込まれません)。これは自動的に処理されるため、SQL 構文の変更は不要です。

削除ベクトルの仕組み

削除ベクトルは、データファイル内のどの行位置が削除されたかを記録する圧縮ビットマップです。削除ベクトルは、テーブルデータと同じ S3 の場所にある Puffin ファイルに保存されます。データファイルごとに、最大 1 つの削除ベクトルがあります。

Iceberg v3 テーブルを読み取ると、Amazon Redshift は自動的に削除ベクトルを適用して、削除された行をクエリ結果から除外します。

位置削除ファイルに優る利点

  • 削除ベクトルは、位置削除ファイルよりもコンパクトです。

  • データファイルごとに 1 つの削除ベクトルを使用することで、多数の小さな削除ファイルが蓄積されるのを回避できます。

  • 同じデータファイルに対する後続の削除では、以前の削除と新しく削除された位置をマージした新しい削除ベクトルが生成され、データファイルごとに削除ベクトルが 1 つ維持されます。

  • 削除ベクトルはよりコンパクトで、多数の小さなファイルの蓄積を回避できるため、Iceberg v2 の位置削除ファイルと比較して読み取りと書き込みが高速です。

v2 から v3 へのアップグレード後の動作

テーブルを Iceberg v2 から v3 にアップグレードした後も、既存の v2 位置削除ファイルは引き続き有効であり、読み取り時に適用されます。その後の書き込みオペレーション (DELETE、UPDATE、または MERGE) では、Iceberg 仕様で定義されているとおり、Amazon Redshift は既存の v2 位置削除を削除ベクトルにマージします。

制限事項

  • 削除ベクトルは Iceberg v2 以前のテーブルではサポートされていません。

  • Iceberg v3 テーブルは、新しい書き込みオペレーションに対して位置削除ファイルにフォールバックすることはできません。つまり、Iceberg v3 テーブルは既存の位置削除ファイルを読み取ることができますが、新しい位置削除ファイルを追加することはできません。代わりに、Iceberg v3 テーブルは削除ベクトルを使用してのみ新しい削除を追加できます。