目的
みなさんBigQuery使ってますか?
大量データを安く楽に管理できてクエリの実行も早くて、一度使うとなかなか離れられませんね。
ところで、BigQueryを使っていて以下のエラーに出くわしたことはありませんか?
Error: Response too large to return.
これはBigQuery側の制約で結果のサイズが128MBを超えた場合に起こります。
Bigなデータを扱ってるのにBigなデータを取り出せないなんて!
Webコンソールからクエリを実行した場合もJava等のプログラムからAPI経由で実行した場合もこの制限は同様です。
BigQuery側ですべて集計するのが正義かもしれませんが、大量の結果に対してさらにプログラムで処理したいことは結構あるのではないでしょうか。
解決方法
Webコンソールでは以下の手順を踏むことでBig(Large?どっち?)なデータを取り出せます。
- クエリのオプションで"Destination TableSelect"のテーブルを指定
- 同じくクエリのオプションで"Allow Large Results"にチェック
- クエリを実行
- "Destination TableSelect"で指定したテーブルをGoogleCloudStorageにCSVファイルとしてエクスポート
- CSVファイルをダウンロード
今回紹介するBeBigQueryはこの面倒な手続きを裏でやってくれるJavaライブラリです。
まずはサンプルから見てみましょう。
// 認証情報
BeBigQuery bbq = new BeBigQuery("project-id", "servic-account", new File("path/file.p12"));
// クエリ実行
Iterable tableRows = bbq.query("select * from dataset.table where condition=11")
.asIterableViaGcs("temp_dataset", "temp_gcs_buckt");
// 結果を表示 TableRowはGoogleのライブラリの型
for (TableRow row : tableRows) {
for (TableCell cell : row.getF()) {
System.out.print(cell.getV().toString() + ",");
}
System.out.println();
}
asIterableViaGcsメソッドの引数に一時的にエクスポートするテーブルのデータセット名、GCSバケット名をそれぞれ指定します。
認証部分も含めて結構シンプルに書けているのではないでしょか。
実はこのBeBigQueryは私がつくったライブラリで手前味噌ではございますが。。
アリと思った方はGitHubのスターをしていただけると嬉しいです。
https://github.com/kamiru78/be-bigquery
使うための準備
Mavenを使う人
pom.xmlに以下を追加してください。
<dependency>
<groupId>com.github.kamiru78</groupId>
<artifactId>be-bigquery</artifactId>
<version>0.4.0</version>
</dependency>
ちなみに最新のバージョンは以下から確認できます。
http://search.maven.org/#search|ga|1|be-bigquery
Mavenを使わない人
以下からJARをダウンロードできます。
http://search.maven.org/#search|ga|1|be-bigquery
右のほうのDownloadの下の"jar"のリンクから。