データの分析や処理に便利なBigQuery(BQ)。
大規模データの処理に優れており、テーブルに保存した大きなデータでも短時間で集計することができる。
そして容量単価に優れているので、データを大量に作っても懐が痛まないのも特徴だ。
そんなBQを使う際に、テーブルのデータ比較をしたい場合がある。
例えば、とある処理を変更したときに変更前後で出力データのうちどのレコードが変わったか差分をとって確認するだろう。
しかしBigQueryで2つのテーブルの差分をどうやってとればいいのか。
そこで今回はBigQueryで2つのテーブルのMINUS差分をとる方法について紹介する。
この記事を書いている人
記事を読むメリット
BigQueryで2つのテーブルのMINUS差分をとる方法がわかり、データ処理で躓かなくなる
データ準備
まずはデータを準備する。
今回は2つのテーブルの差分を撮るので、2つデータを用意する。
ひとつはテーブル名 minus_sample01
として以下のCSVをインポート。
col1,col2,col3 a,b,c aa,bb,cc aaa,bbb,ccc aaaa,bbbb,cccc
もうひとつは minus_sample02
として以下のCSVをインポートする。
col1,col2,col3 a,b,c aa,bb,cc2 aaa2,bbb,ccc aaaa,bbbb,cccc
差分なのでMINUSを試してみる。
ではこの2つのテーブルの差分をとるにはどうしたらいいのか。
minus
が使えるんだけど・・・実際に試してみる。
SELECT * FROM test.minus_sample01 MINUS SELECT * FROM test.minus_sample02
結果は以下の通り。
Syntax error: Expected end of input but got keyword SELECT at [3:1]
Syntax error
、つまりSQLの構文エラーとなる。
MINUS
は使えませんねBigQueryで2つのテーブルのMINUS差分をとる方法
BigQueryで2つのテーブルのMINUS差分をとるには集合演算子の EXCEPT DISTINCT
を用いる。
使い方は MINUS
と同じ。
SELECT * FROM test.minus_sample01 EXCEPT DISTINCT SELECT * FROM test.minus_sample02
結果は以下のようになる。
Row | col1 | col2 | col3 |
1 | aa | bb | cc |
2 | aaa | bbb | ccc |
minus_sample01
にあって minus_sample02
に無い行だけ抽出することができた。
逆に minus_sample02
だけにある行を抽出したければ前後を入れ替えれば良い。
SELECT * FROM test.minus_sample02 EXCEPT DISTINCT SELECT * FROM test.minus_sample01
結果はこの通り。
Row | col1 | col2 | col3 |
1 | aa | bb | cc2 |
2 | aaa2 | bbb | ccc |
2つめのテーブルにしか無い行が抽出できた。
まとめ
今回はBigQueryで2つのテーブルのMINUS差分をとる方法について解説した。
BigQueryで2つのテーブルの差分(差集合)をとる方法は以下の通り。
ココがポイント
集合演算子の EXCEPT DISTINCT
を用いる。
UNION ALL
と同じようなものですね他にもBigQueryに関する記事もあるので、興味があれば見てみて欲しい。