はじめに
最近社で BigQuery にクエリ投げて結果を取得して、その結果をごにょごにょするというのをやり始めて BigQuery に入門したのだけれどそりゃそうですよねということでハマったのでメモとして残しておく。
基本的な処理
使うのは Ruby と google-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 なんか色々便利そうなのでちゃんと情報収集しなければ...となっている