はじめに
こんにちは。データ・AIシステム本部 MA部の平井です。
本日はBigQueryのEXPORT DATAにおいて最小ファイル数でGCSにエクスポートする方法についてお話ししたいと思います。
背景
MA部では在庫などのZOZOTOWNのデータ更新をトリガーに配信を行うパーソナライズ配信システムを開発、運用しています。
パーソナライズ配信システムではAlloyDBをデータベースとして活用していて、配信に必要なデータマートをBigQueryで集計し、AlloyDBに連携するという処理があります。
BigQueryのEXPORT DATAステートメントを利用し、GCS上にCSVファイルをエクスポートし、AlloyDBのCSVファイルインポート機能を利用してデータ連携しています。
課題
実際にデータ連携を実行してみると、連携データサイズが大きくないにも関わらず複数ファイルがGCSにエクスポートされていることがわかりました。
公式ドキュメントには1ファイルで出力できる最大サイズは1GBと記載されているので1GBまでは1ファイルで出力されると考えられますが、実際は異なりました。
AlloyDBのCSVファイルインポート機能では複数ファイルを指定出来ないため、ファイル数に応じてインポートオペレーションが増え、連携処理時間に影響を与えていたのが課題でした。
解決策
クエリにDISTINCT、ORDER句、LIMIT句を追加すると出力できるファイルを制限できるという情報があったので、試してみたところ最小ファイル数でエクスポートすることに成功しました。(参考記事)
上記を追加するとBigQuery内部のワーカーを制限でき、それによって最小ファイル数でエクスポートしてくれるようです。
検証
上記の条件を記載しないと3つのファイルに分割されてエクスポートされてしまいます。
また各ファイルサイズを合計しても1GBに満たないこともわかります。
以下の画像から分かるようにそれぞれクエリに条件を加えると1ファイルでエクスポートされていることがわかります。
最後に
クエリに条件を加えて最小ファイル数でGCSにエクスポートすることができました。
また、ファイル数が制限されてAlloyDBへのCSVインポートオペレーション数も制限され、余計な処理を削減できました。




