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