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上でインポートしたデータにクエリー発行して抽出。その結果を別テーブルとして新たに作り直した方がずっと早かった。