ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

S3 Tablesのデータはどう更新する?INSERT・DELETE・UPDATE・MERGEを実践!

こんにちは、開発グループの寺田です。

本記事では、Amazon Athenaを使用して、INSERT・DELETE・UPDATE・MERGEクエリを実行し、S3 Tablesのデータ変更を検証します。

INSERT INTO

Athena IcebergのINSERT INTOは、Icebergテーブルに複数件のデータ登録が可能で、 スキャンしたデータ量に応じて課金されます。

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

それではレコードを数件登録します。

クエリが成功したので、SELECTを実行してデータが登録されたか確認します。

S3 Tablesのテーブルバケットでは内部のデータ構造を直接確認できないため、
汎用バケットを使用したセルフマネージドのIceberg テーブルで検証します。
同様のテーブルを作成し、INSERT INTOクエリを実行します。

汎用バケットを確認すると、以下のフォルダが作成されていました。

  • data : Parquet ファイルが格納
  • metadata : Jsonファイルが格納

今回のテーブルはパーティションを設定せずに作成しました。
その結果、4レコードが1つのParquetファイルに格納され、
メタデータがJsonファイルに格納されていました。

Parquetファイル

Jsonファイル(一部抜粋)

DELETE

Athena IcebergのDELETEを実行すると、位置削除ファイルが作成され、データは直接書き換えられません。 この仕組みは「読み込み時マージ削除」と呼ばれ、コピーオンライト削除よりも効率的です。

AthenaはIcebergのデータを読み込む際に データファイルと削除ファイルをマージして最新のビューを生成します。 不要な位置削除ファイルを削除するには、REWRITE DATA圧縮アクションを実行します。
※DELETEの実行には、スキャンしたデータ量に応じた課金が発生します。

DELETE FROM [db_name.]table_name [WHERE predicate]

先ほど登録したレコードから1レコード削除します。

クエリが成功したので、SELECTを実行してデータが削除されたか確認します。

セルフマネージドのIcebergテーブルで内部を確認します。 登録時のParquet内のデータは直接削除されず、以下のParquetファイルとmetadataファイルが追加されていました。
Parquetファイル(INSERT INTO 実行時に作成)
Parquetファイル(DELETE 実行時に作成)

Jsonファイル(一部抜粋)

UPDATE

Athena IcebergのUPDATEを実行すると、位置削除ファイルと更新後のデータを同じトランザクション内のデータとして書き込みます。
実質的にINSERT INTOとDELETEを組み合わせた処理となり、スキャンしたデータ量に応じて課金されます。

UPDATE [db_name.]table_name SET xx=yy[,...] [WHERE predicate]

先ほど登録したレコードから1レコード更新します。

クエリが成功したので、SELECTを実行してデータが更新されたか確認します。

セルフマネージドのIcebergテーブルで内部を見てみると、登録時のParquet内のデータに変更はなく、 INSERT INTOとDELETEを組み合わせた処理が行われていることを確認できました。
Parquetファイル Jsonファイル(一部抜粋)

MERGE INTO

Athena IcebergのMERGE INTOを実行すると、条件付きでレコードの更新・削除・挿入を 1 つのステートメントで実行できます。

MERGE INTO target_table [ [ AS ]  target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
when_clause [...]

MERGE INTOを使用することでUPSERTが可能です。

まとめ

Iceberg テーブルのデータ更新について、INSERT・DELETE・UPDATE・MERGE の動作を検証しました!
実際に検証を進める中で、REWRITE DATA 圧縮アクションの仕組み や S3 Tablesでメタデータを確認する方法の有無が気になりました。
今後、これらのポイントについてさらに調査し、掘り下げていきたいと思います。