LoginSignup
7
6

More than 5 years have passed since last update.

Google BigQueryからtoo largeなデータを取得する(Java編)

Posted at

目的

みなさん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"のリンクから。

7
6
0

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
7
6