LoginSignup
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-20

業務で一部のログは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]

公式マニュアル

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
6