LoginSignup
3
1

More than 5 years have passed since last update.

RubyでBigQueryから引っ張ってきたデータをそのままテーブルに突っ込む

Posted at

前置き

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との違いについても、おざなりに理解しているので、調べたい。(些細な事でもご存知の方おられましたら、ご教授願いたいです)

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1