yskma’s blog

日々の作業の備忘録@株式会社ビズオーシャン

bq loadで正規表現が使えないのでxargsでなんとかしてみる

大量にあるcsvファイルから特定の複数ファイルを対象にコマンドライン上からbig queryにインポートしたい。
bq loadと正規表現でどうにかなるかと思ったが、bq loadはワイルドカードしか使えなかった。正規表現を含めるとエラーになる。
下記ならOK。

bq --location=US load --source_format=CSV --schema=./myschema.json gs://mybucket/dir1/1¥*.csv bqdb.mytable

アスタリスクの前にエスケープ文字を入れないと認識してくれない

100.csv, 101.csv, 102.csv ... 1000.csv, 1001.csv ... 3000.csv

gs上にこんなファイル群があったとして、
1000.csvから1999.csvまでインポートしたい。
ワイルドカードだけだと1*.csvのように指定すると100.csv~199.csvまでも対象になってしまう。
 
そこで、gsutilから対象ファイルをegrepでフィルターしてxargsでbq loadを実行してみる。

gsutil ls gs://mybucket/dir1/\* | egrep '/1[0-9]{3}\.' | xargs -L1 bq --location=US load --source_format=CSV --schema=./myschema.json bqdb.mytable

うまくいった。
ただしbqのjobが大量につくられるのでファイルが多いと大変に時間がかかってしまう。

結局、対象となるファイルをワイルドカードであらかじめ全部big queryにインポートしてから、
bq上でインポートしたデータにクエリー発行して抽出。その結果を別テーブルとして新たに作り直した方がずっと早かった。

備考、というかわかったこと

google strageからbig queryへのインポート時にワイルドカードを使うと、同数のファイルを指定して個別にインポートする時に比べて処理に要する時間が格段に短くなる。