概要
BigQueryは基本的にはログなど解析目的で利用するため、データ自体を更新することはありません。ただ
- 一部間違ったログが入ってしまった
- データの洗い替えが必要になった
みたいなケースが起き、解析結果が期待するものにならない場合は更新処理が必要です。
2016/11からDML(データ操作言語)が使えるようになったので、それを使って更新します。
注意事項
BigQueryは基本的に取得系メソッドをメインで利用するものなので、DMLに関しては以下のような制限があります。
ref: Data Manipulation Language | BigQuery | Google Cloud
なので1レコードずつ更新するクエリをループで回すなんてことはせずに、一気に複数のレコードを更新するクエリを発行するようにしてください。
更新方法
ケース
今回
- 特定のユーザの持つステータスに間違った値(
status=0
)が入ってしまった status=1
としたい- 対象ユーザのリストは持っている
というケースを想定します。
オプションの設定
更新クエリはLegacySQL
では使えないので、以下のようにShow Options
でチェックをOFFする必要があります。
SELECTで確認
念のため対象ユーザを表示して、更新対象かどうかを確認します。
SELECT * FROM `project.dataset.table` Where _PARTITIONTIME = TIMESTAMP('2018-03-09') AND user_id IN("user001", "user002")
UPDATEで更新
問題なさそうであれば、データを更新します。
UPDATE
にテーブル名を、SET
に更新するカラムと値を入れます。
UPDATE `project.dataset.table` SET status=1 WHERE _PARTITIONTIME = TIMESTAMP('2018-03-09') AND user_id IN("user001", "user002")
データ量に比例して時間がかかるので、パーティションテーブルなどを利用してなるべく対象のデータ量を少なくすると良いです。
実行が完了すると更新したレコード数が表示されます。