前置き
bigqueryとはなんぞや?という話はしません。(当方よくわかっていないので)
簡単なrubyスクリプトをメモ書き程度に残します。
使ったライブラリ
え、google-api-clientじゃないの?と思われる方いるかもしれませんが、今回はgoogle-cloud-rubyを使いました。理由としては、
- クエリ叩いて、返ってくる値が [{field: value}] の形式だったから、そのままデータを突っ込めるから。
- google-api-clientだとfield: valueの形式で取れなかった。
- こういった違いがなぜあるのかはよくわかっていない。
-
http://googlecloudplatform.github.io/google-cloud-ruby/ ページ下部のFAQに、google-cloudライブラリは、GCP専用で、Rubyと統合するための推奨って書いてある。
- GCP以外のAPI(Gmailとか)使いたいときは、google-client-ruby使うって解釈した。
簡単なスクリプト解説
認証
require "google/cloud/bigquery"
big_query = Google::Cloud::Bigquery.new(
project: "プロジェクトID",
keyfile: "key_fileへのPATH"
)
これだけ。簡単☆
データセット
data_set = big_query.dataset("データセット名")
# データセット作りたいときは
data_set = big_query.create_dataset("データセット名")
どのデータセットにテーブル作るか。
ジョブとテーブル
job = big_query.query_job(sql)
job.wait_until_done!
unless job.failed?
current_row = 0
result = job.query_results
table = big_query.create_table("テーブル名", fields: result.fields)
while current_row < result.total
result = job.query_results(start: current_row) unless current_row == 0
table.insert(result)
current_row += result.size
end
取得するデータ量が多いと、自動的に分割されて取得してくるので、何回かに分けて、query_resultsを実行する必要がある。result.totalで合計数が取得できるので、ループごとに1回のquery_resultsで取得した数をoffset値として足していき、startでoffset値を指定してquery_resultsを取得して、テーブルへインサートする。これを繰り返して、offset値が合計数より上回ったら終了。
所感
やりたいことがシンプルだったので、比較的簡単なコードになったが、もう少し複雑なことをすると大変そうだし、取ってきたデータをruby上で操作するのは、マシン的につらそうなので、できるだけクエリを最適化して、rubyではあくまで自動的に実行するだけ、みたいにしたい。そのためにBigQueryのクエリを学ばねば...
google-api-clientとの違いについても、おざなりに理解しているので、調べたい。(些細な事でもご存知の方おられましたら、ご教授願いたいです)