まっしろけっけ

めもてきなやーつ

BigQuery に入門したのでハマったことをメモする

はじめに

最近社で BigQuery にクエリ投げて結果を取得して、その結果をごにょごにょするというのをやり始めて BigQuery に入門したのだけれどそりゃそうですよねということでハマったのでメモとして残しておく。

基本的な処理

使うのは Rubygoogle-cloud-bigquery です。
README にも載ってますが基本的には下記のような感じで書きます。

$ gem install google-cloud-bigquery
$ irb
require "google/cloud/bigquery"

bigquery = Google::Cloud::Bigquery.new(
        project_id: "hogehoge",
        credentials: gcp_credential_path
      )

data = dataset.query "SELECT * FROM table"

data.each do |row|
  puts row[:hoge]
end

table が既に存在していればこんな感じで情報が取得できるわけですよ。

取得する件数が多い場合

今回ハマったのがこのパターンです。クエリで取得する件数が多い(100000件以上の)場合実は上記の方法では 100000 件しか取得できないのであった...
Treasure Data の workflow の結果取得する際は気にしなくてよかったのでハマったが limit かかるのは当然と言えば当然ですね...

data = dataset.query "SELECT * FROM table LIMIT 1000000"

data.count
=> 100000

table に 100000 件以上のデータがあった場合上記のような結果になってしまいます。
なのでお手軽に全件取りたい場合は下記のようにする必要があります

data = dataset.query "SELECT * FROM table LIMIT 1000000"

begin
 puts data.count
end until (data = data.next).nil?

Google:: Cloud:: Bigquery::Job を使う場合は下記のような感じ

dataset = bigquery.dataset("dataset_name")
job = dataset.query_job "SELECT * FROM table LIMIT 1000000"
job.wait_until_done!

data = job.data
begin
 puts data.count
end until (data = data.next).nil?

さいごに

BigQuery なんか色々便利そうなのでちゃんと情報収集しなければ...となっている