Help us understand the problem. What is going on with this article?

bigqueryで大量データ処理する時のオプション

More than 3 years have passed since last update.

業務で一部のログはbigqueryに保存しているんですが、少量のデータならWebUI上でサクッと取得ができるのですが、大量データとなるとコマンドライン上でバッチジョブを動かす必要があり、そのオプションをいつも忘れるので、備忘録として残しておきます

allow_large_resultsとdestination_table

クエリ結果が最大レスポンスサイズを超える場合に、--allow_large_resultsを指定し、--destination_table + テーブル名で結果セットの保管先を指定します。

$ bq query --destination_table '[DATASET].[TABLE_NAME]' --allow_large_results "[QUERY]"

バッチクエリを利用する

--batchを指定することで、バッチジョブとして、クエリを実行します

上記を組み合わせて、レスポンスサイズが大きい場合、バッチジョブとして、クエリを走らせ、結果をテーブルとして保管するようにすると、データを操作しやすくなります。

$ bq query --nosync --batch \
--destination_table [DATASET].[TABLE_NAME] \
--allow_large_results "[QUERY]"

テーブルデータをGCSにエクスポートする

bigqueryのテーブルデータはGCSにエクスポートできるので(CSV,JON,AVRO)、他のデータストア(RDBMSやElasticSearch等)に集計結果を移行する場合等、GCSに一度エクスポートすれば可能になります。

$ bq extract --destination_format=[CSV | NEWLINE_DELIMITED_JSON | AVRO] [DATASET].[TABLE_NAME] gs://[BUCKET_NAME]/[FILENAME]

FILENAMEの箇所はワイルドカードを使用すると、自動でパーティション分割をしてくれます。

番外編: csvデータをbigqueryにインポートする

大量クエリとはまた別ですが、インポートコマンドのドキュメントも別ページになっていて忘れがちなので...

$ bq load babynames.names2010 yob2010.csv name:string,gender:string,count:integer --skip_leading_rows=1

--skip_leading_rowsオプションで先頭から指定した行数をスキップする

  • JSONの場合
$ bq load --source_format=NEWLINE_DELIMITED_JSON [DATASET].[TABLE_NAME] [PATH_TO_SOURCE] [SCHEMA]

公式マニュアル

tanish-kr
東京でWeb系エンジニアをやってます。 フロントエンドから始まり、バックエンド、インフラ(AWS利用)まで一通り経験してきました。 ライブラリを作成するときはRubyが最近多くなってきた気がします
http://carefree-se.hatenablog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away