Iceberg テーブルデータの更新 - Amazon Athena

Iceberg テーブルデータの更新

Iceberg テーブルデータは、INSERTUPDATE、および DELETE クエリを使用して、Athena で直接管理できます。データ管理トランザクションごとに新しいスナップショットが生成され、タイムトラベルを使用してクエリできます。UPDATE および DELETE ステートメントは、Iceberg 形式 v2 の行レベル position delete 仕様に従い、スナップショットを分離します。

次のコマンドを使用して、Iceberg テーブルでデータ管理オペレーションを実行します。

INSERT INTO

Iceberg テーブルにデータを挿入します。Athena Iceberg INSERT INTO は、現在の INSERT INTO が外部 Hive テーブルに対してクエリする場合と同じく、スキャンしたデータ量の分だけ課金されます。Iceberg テーブルにデータを挿入するには、次の構文を使用します。queryVALUES (val1, val2, ...) または SELECT (col1, col2, …) FROM [db_name.]table_name WHERE predicate のいずれかです。SQL 構文とセマンティクスの詳細については、「INSERT INTO」を参照してください。

INSERT INTO [db_name.]table_name [(col1, col2, …)] query

次の例では、テーブル iceberg_table に値を挿入します。

INSERT INTO iceberg_table VALUES (1,'a','c1')
INSERT INTO iceberg_table (col1, col2, ...) VALUES (val1, val2, ...)
INSERT INTO iceberg_table SELECT * FROM another_table

DELETE

Athena Iceberg DELETE は、Iceberg 位置削除ファイルをテーブルに書き込みます。これは、読み込み時マージ削除と呼ばれます。コピーオンライト削除とは対照的に、ファイルデータを書き換えないため、読み込み時マージ削除のほうが効率的です。Athena は、Iceberg データを読み込むときに、Iceberg 位置削除ファイルをデータファイルとマージして、テーブルの最新のビューを生成します。こうした位置削除ファイルを削除するには、REWRITE DATA 圧縮アクションを実行します。DELETE オペレーションは、スキャンしたデータ量の分だけ課金されます。構文については、「DELETE」を参照してください。

次の例では、category の値が c3iceberg_table から行を削除します。

DELETE FROM iceberg_table WHERE category='c3'

UPDATE

Athena Iceberg UPDATE は、Iceberg 位置削除ファイルと新しく更新された行を同じトランザクション内のデータファイルとして書き込みます。UPDATE は、INSERT INTODELETE を組み合わせたものと考えることができます。UPDATE オペレーションは、スキャンしたデータ量の分だけ課金されます。構文については、「UPDATE」を参照してください。

次の例では、テーブル iceberg_table の指定された値を更新します。

UPDATE iceberg_table SET category='c2' WHERE category='c1'

MERGE INTO

条件付きで Iceberg テーブルに行を更新、削除、または挿入します。単一のステートメントで、更新、削除、挿入のアクションを組み合わせることができます。構文については、「MERGE INTO」を参照してください。

注記

MERGE INTO はトランザクションで、Athena エンジンバージョン 3 の Apache Iceberg テーブルでのみサポートされています。

次の例では、ソーステーブル s にあるテーブル t からすべての顧客を削除します。

MERGE INTO accounts t USING monthly_accounts_update s ON t.customer = s.customer WHEN MATCHED THEN DELETE

次の例では、ソーステーブル s の顧客情報でターゲットテーブル t を更新します。テーブル s 内の顧客の行が一致する顧客行が t にある場合、この例ではテーブル t の購入をインクリメントします。テーブル t がテーブル s 内の顧客の行と一致しない場合、この例では、顧客の行をテーブル s からテーブル t に挿入します。

MERGE INTO accounts t USING monthly_accounts_update s ON (t.customer = s.customer) WHEN MATCHED THEN UPDATE SET purchases = s.purchases + t.purchases WHEN NOT MATCHED THEN INSERT (customer, purchases, address) VALUES(s.customer, s.purchases, s.address)

次の例では、ソーステーブル s の情報でターゲットテーブル t を条件付きで更新します。この例では、送信元アドレスが Centreville である一致するターゲット行をすべて削除します。一致するすべての行について、この例では送信元購入を追加し、ターゲットアドレスを送信元アドレスに設定します。ターゲットテーブルに一致するものがない場合、この例では送信元テーブルから行を挿入します。

MERGE INTO accounts t USING monthly_accounts_update s ON (t.customer = s.customer) WHEN MATCHED AND s.address = 'Centreville' THEN DELETE WHEN MATCHED THEN UPDATE SET purchases = s.purchases + t.purchases, address = s.address WHEN NOT MATCHED THEN INSERT (customer, purchases, address) VALUES(s.customer, s.purchases, s.address)