MaxCompute SQLでデータ更新と削除する方法

Kouです。

既にご存じの方もいらっしゃると思いますが、MaxCompute SQLでは、データ更新(Update)と削除(Delete)をサポートしません。ただ、実際の業務の中で必要なケースも存在しています。そのケースに遭遇した場合にどうすればいいのでしょうか。本記事で実際の例を交えながら、対策を皆さんに共有させて頂きたいと思います。

  • データ更新

MaxComputeでデータ投入を行う際に、Insert Into/Overwrite 2種類の方法があり、それぞれ違う意味合いを持ちます。Insert Intoは、テーブルやパーティションに追加データが挿入されるのに対し、Insert Overwrite は、テーブルやパーティションから元のデータを削除してからデータが挿入され、データの置き換えとも言えます。

MaxCompute SQLは、SQLに似たような構文を使用できますが、SQL全ての標準に準拠しているわけではないため、Update文がありません。ただ、Insert Overwrite文を上手く活用すれば、データ更新を実現することも可能です。それでは、事前に作成したdemoテーブルを使い、試して見ます。

demoテーブル (Partitionは'20181208'です)は下記のようとなります。

select * from demo where dt = '20181208';

cityコラムの一行目のBerlinをMunichに更新したいのであれば、下記の構文で実行すると、レコード更新ができるようになりました。

insert overwrite table demo partition (dt='20181208') select customerid,customername,contactname,address,case when city='Berlin' then 'Munich' else city end as city,postalcode,country from demo where dt = '20181208';

select * from demo where dt='20181208';

  • データ削除

標準SQLと同様に、テーブルの全レコードを削除したいのであれば、TRUNCATE TABLE table_nameを使えば、問題なく実現することができます。もし指定したいレコードを削除したい場合は、上述のInsert Overwrite文を利用して実現することも可能です、demoテーブルの例で使い方をみて見ましょう。例えば、'Munich'が含まれている行を削除したいならば、下記の構文を実行すると、削除動作ができるようになります。

insert overwrite table demo partition (dt='20181208') select customerid,customername,contactname,address,city,postalcode,country from demo where city != 'Munich' and dt='20181208';

select * from demo where dt='20181208';

  • まとめ

いかがでしたでしょうか。Update文とDelete文がないため、悩ましい更新と削除の作業はInsert overwrite構文を活用すれば、実現できるようになりました。皆さんもぜひ活用してください。