BigQuery

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

More than 1 year has 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]


公式マニュアル