【小ネタ】 Amazon AthenaのMERGE INTOでIcebergテーブルへのソースデータ重複を検証
はじめに
データ事業本部ビッグデータチームのkasamaです。
今回はAmazon Athenaで、merge into文をIceberg tableに対して実行した時に、ソースデータに重複があった場合の動作を検証したいと思います。
テストデータ準備
LOCATIONのS3 Bucketは手動で用意したものを設定します。テストデータもSQL文でInsertし、準備は完了です。
CREATE DATABASE cm_kasama_merge_test;
CREATE TABLE merge_test_table (
id INT,
name STRING,
value INT
)
LOCATION 's3://<your_s3_bucket>/merge_test_table/'
TBLPROPERTIES (
'table_type'='iceberg',
'write_compression' = 'zstd',
'format'='PARQUET'
);
-- 初期データを挿入
INSERT INTO merge_test_table VALUES
(1, 'A', 100),
(2, 'B', 200),
(3, 'C', 300);
-- 初期状態確認
SELECT * FROM merge_test_table ORDER BY id;
検証
Update、Delete、Insertの順で重複があった場合の動作を確認します。
Update
id=2はターゲットに存在し、ソースに2回出現するので、Updateの重複となります。
MERGE INTO merge_test_table t
USING (
SELECT 2 as id, 'B-updated1' as name, 250 as value
UNION ALL SELECT 2 as id, 'B-updated2' as name, 280 as value
) s
ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET name = s.name, value = s.value;
失敗しました。
MERGE_TARGET_ROW_MULTIPLE_MATCHES: One MERGE target table row matched more than one source row
Delete
id=1はターゲットに存在し、ソースに2回出現するので、Deleteの重複となります。
MERGE INTO merge_test_table t
USING (
SELECT 1 as id, 'A' as name, 100 as value
UNION ALL SELECT 1 as id, 'A' as name, 100 as value
) s
ON t.id = s.id
WHEN MATCHED THEN
DELETE;
失敗しました。
MERGE_TARGET_ROW_MULTIPLE_MATCHES: One MERGE target table row matched more than one source row
Insert
id=4はターゲットに存在せず、ソースに2回出現するので、Insertの重複となります。
MERGE INTO merge_test_table t
USING (
SELECT 4 as id, 'I-new1' as name, 400 as value
UNION ALL SELECT 4 as id, 'I-new2' as name, 450 as value
) s
ON t.id = s.id
WHEN NOT MATCHED THEN
INSERT (id, name, value) VALUES (s.id, s.name, s.value);
成功し、キーが重複してInsertされています。
最後に
UpdateとDeleteについては、1つのターゲット行に対して複数のソース行がマッチする場合に「MERGE_TARGET_ROW_MULTIPLE_MATCHES」エラーが発生しました。
よく見たら最初のドキュメントにも以下の記載がありましたね。。
A user error is raised when a single target table row matches more than one source row.
Insertについてはドキュメントみた限り、AthenaのIcebergで主キー制約設定できないので重複されて登録するようです。