case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

BigQueryでサイズの大きいデータをGCSに出力する方法

データ分析する場合BigQueryで集計し、集計結果をGCSに出力、Jupyterで分析することが多いかと思います。
集計結果が大きいとそのままCloud Storageに出力することはできません。集計結果をBigQueryのテーブルに出力し、Cloud Storageへエクスポートを選ぶと以下のようなメッセージがでます。

Table gs://・・・・ too large to be exported to a single file. Specify a uri including a * to shard export. See 'Exporting data into one or more files' in https://cloud.google.com/bigquery/docs/exporting-data.

このようにデータが大きい場合はbqコマンドのextractでBigQueryのテーブルからCloud Storageに分割して出力し、
gsutil composeでデータをまとめてあげる必要があります。

$ bq extract --destination_format=CSV --print_header=false [dataset.table name] "[gs://・・・・_*.csv]"

$ gsutil compose "gs://・・・・*.csv " "gs://・・・・csv"

composeの上限は32ファイルまでなので、分割されたファイルが32ファイルを超える場合はcomposeしたデータをさらにcomposeしてあげる必要があります。例えば分割されたファイルが90ファイルあるなら、30ファイルずつ3回composeを行い、composeした結果をもう一度composeしてあげる必要があります。合計で、4回composeを実行する必要があるので少し面倒です。

あと、出力する際にheader=falseにしないとcomposeの際にheaderが含まれてしまうので注意が必要です。