【小ネタ】 Amazon AthenaのMERGE INTOでIcebergテーブルへのソースデータ重複を検証

【小ネタ】 Amazon AthenaのMERGE INTOでIcebergテーブルへのソースデータ重複を検証

Clock Icon2025.04.10

はじめに

データ事業本部ビッグデータチームのkasamaです。
今回はAmazon Athenaで、merge into文をIceberg tableに対して実行した時に、ソースデータに重複があった場合の動作を検証したいと思います。

https://docs.aws.amazon.com/athena/latest/ug/merge-into-statement.html

テストデータ準備

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;

Screenshot 2025-04-10 at 7.46.11

検証

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

Screenshot 2025-04-10 at 7.50.48

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;

Screenshot 2025-04-10 at 7.55.40

失敗しました。
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されています。
Screenshot 2025-04-10 at 7.58.21
Screenshot 2025-04-10 at 7.58.54

最後に

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で主キー制約設定できないので重複されて登録するようです。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/querying-iceberg-creating-tables.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.