Iceberg テーブルデータの更新
Iceberg テーブルデータは、INSERT
、UPDATE
、および DELETE
クエリを使用して、Athena で直接管理できます。データ管理トランザクションごとに新しいスナップショットが生成され、タイムトラベルを使用してクエリできます。UPDATE
および DELETE
ステートメントは、Iceberg 形式 v2 の行レベル position delete
次のコマンドを使用して、Iceberg テーブルでデータ管理オペレーションを実行します。
INSERT INTO
Iceberg テーブルにデータを挿入します。Athena Iceberg INSERT INTO
は、現在の INSERT INTO
が外部 Hive テーブルに対してクエリする場合と同じく、スキャンしたデータ量の分だけ課金されます。Iceberg テーブルにデータを挿入するには、次の構文を使用します。query
は VALUES
(val1, val2, ...)
または SELECT (col1, col2, …) FROM
[
のいずれかです。SQL 構文とセマンティクスの詳細については、「INSERT INTO」を参照してください。db_name
.]table_name
WHERE predicate
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
の値が c3
の iceberg_table
から行を削除します。
DELETE FROM iceberg_table WHERE category='c3'
UPDATE
Athena Iceberg UPDATE
は、Iceberg 位置削除ファイルと新しく更新された行を同じトランザクション内のデータファイルとして書き込みます。UPDATE
は、INSERT INTO
と DELETE
を組み合わせたものと考えることができます。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)