BigQueryへデータを高速にロードする方法まとめ
BigQueryは大規模データでもパフォーマンスを発揮することから、大量のファイル(CSVファイルなど)をロードする処理がよくあります。
その際、BigQueryの特性を活かしてファイルをロードすることで高速化することが可能ですので、その方法についてまとめてみました。
GCSからのワイルドカード(*)を指定して一括でロードする
BigQueryへデータをロードする場合、利用する言語などによって多少違いはありますが、登録するデータを指定するパラメータが存在するはずです。
例えば、bqコマンドであれば「–data_source」などです。
その際、ロードするファイルを以下のように1ファイル限定でロードしていないですか?
gs://[バケット名]/xxxxx/yyyyy/zzz.csv
1ファイルや数ファイル程度ならこの方法でもそれほど処理速度に問題はないかもしれませんが、ロード対象のファイルが数百ファイル、数千ファイルと大きくなるにつれて、目に見えてパフォーマンスが劣化してきます。
高速化の方法として、GCSのパスをワイルドカード(*)を使用することです。
具体的には、以下のようにします。
gs://[バケット名]/xxxxx/yyyyy/*
これで、「gs://[バケット名]/xxxxx/yyyyy/」配下のファイルが全てロード対象となります。
BigQueryはワイルドカード指定された場合に、並列でロード処理が実行されるためロード時間がかなり高速化されます。
実際に、1ファイル100MBのファイルをロードする場合に
1ファイルロード:20秒
100ファイルロード:20秒
といったことが普通に起こります。
並列でロード処理されていることが実感できます。
gzip圧縮したCSVファイルをロード対象としない
GCSにCSVファイルをそのまま蓄積するのではなく、バケットの容量節約のためにgzip圧縮したファイルを保存することをすることがあります。
BigQueryのロード処理はgzip圧縮したファイルをサポートしていますが、非圧縮のCSVファイルよりもgzip圧縮したファイルの方がロード処理が遅くなります。
理由は、ロード処理が並行して処理されないためです。
別クラウドのストレージ(AWSのS3など)からデータをBigQueryへロードする必要がある場合などで、ネットワーク帯域が細い場合に、トータルでの実行時間はgzip圧縮した方が早くなる可能性もあります。