64
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RubyでBigQueryから簡単にデータを取得する 2017年1月最新版

Posted at

はじめに

みなさんGoogleのBigQuery使ってますか?とても便利なのでこちらの記事でも紹介させて頂いたように弊社でもほぼ全てのデータをBigQueryに入れて分析しています。

RubyからBigQueryを扱うGemは以前からいくつか存在しているのですが、現状の最新(2017年1月時点)ではどう扱うのが一番良いのかをまとめておきます。

BigQueryを扱えるGem達

abronte/BigQuery

Googleで検索すると一番上に出てくるのでこのGemを利用している人も多いと思います。
しかし、2016年になってからあまりメンテされている様子はありませんので、利用は控えたほうが良いでしょう。

google/google-api-client-ruby

こちらのGoogleが提供しているgoogle-api-client-rubyを最新版にしてBigQueryのインターフェースを直接利用することも出来ますが、ドキュメントもサンプルコードもほぼありませんので、ソースをひたすら読んで実装する必要があります。あまりおすすめできません。

GoogleCloudPlatform/google-cloud-rubyを使う(推奨)

実はGoogleがBigQueryを扱うためのGemgoogle-cloud-bigqueryを半年ぐらい前にリリースしてくれています。(google-api-clientとは別に)
GoogleのCloud関連のAPIを呼ぶためのgoogle-cloudというGemの一部です。

gem install google-cloud-bigquery

こちらは公式ドキュメントやサンプルコードも全て用意されています。
そしてgoogle-api-clientも最新のバージョンに対応しています。

こちらのGemのほうが極めてシンプルですし、Googleもこちらの利用を推奨しています。

google-cloud-bigqueryを用いたサンプルコード

同期的にデータを取得する

結果のサイズが10MB以下であればこちらで取得できます。

sync.rb
require "google/cloud/bigquery"

bigquery = Google::Cloud::Bigquery.new(
  project: "test-project", #BigQueryのプロジェクトID
  keyfile: "./auth.json" #認証用JSONキーファイル
)

sql = "select id from app.items limit 1000"
data = bigquery.query sql

puts data.count

data.each do |row|
  puts row["id"]
end

非同期でデータを取得する

クエリの実行に時間がかかる場合などはこちらを利用しましょう。

async.rb
require "google/cloud/bigquery"

bigquery = Google::Cloud::Bigquery.new(
  project: "test-project",
  keyfile: "./auth.json"
)

job = bigquery.query_job sql

job.wait_until_done!

unless job.failed?
  puts job.query_results.size
  job.query_results.each do |row|
    puts row["id"]
  end
end

めんどくさい処理は必要ありません、非常にシンプルでわかりやすいインターフェースになっています。

大きい結果サイズを扱う場合

query_jobの引数にlarge_results:truetableを設定する必要があります。(この場合はtable名ではなくtableオブジェクトなので注意)

large_result.rb
dataset = bigquery.dataset "tmp"
result_table = dataset.create_table "results"
sql = "SELECT id from app.items limit 110001"

job = bigquery.query_job(sql, table: result_table, write: 'truncate', large_results: true)

StandardSQL対応は?

google-cloud-rubyも丁度先月@yancyaさんのコミットがマージされたことにより、Standard SQLのサポートがされたので、Standard SQLを利用することができます。

standard_sql.rb
sql = "select FORMAT_TIMESTAMP('%Y-%m-%d %H-%M-%S', CURRENT_TIMESTAMP, 'Asia/Tokyo') as t"

data = bigquery.query sql, legacy_sql: false #use_legacy_sqlでないことに注意
puts data

まとめ

RubyからシンプルにBigQueryを扱いたい場合はgoogle-cloud-bigqueryを利用しましょう。

64
29
1

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
64
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?