🥓

[BigQuery]大量のDDLを実行するシェルスクリプトを作ってみた

2022/07/21に公開

コマンドラインからBigQueryに大量のDDLを実行するシェルスクリプトを作ったので覚書き

前提条件

ディレクトリ構成

実行用シェルファイルと同階層にddlディレクトリを作成し、その下にddlを記載したファイルを格納する

 /
 |--- execDdl.sh -- 実行用シェルファイル
 |
 |--- ddl -- DDL配置ディレクトリ: 配下に実行したいDDLを置く
       |--- xxx.ddl
       |--- yyy.ddl
       |--- zzz.ddl
             :

プログラム

データセットの作成から、DDLの実行までを実行する内容です
データセット名は、test_bqとしています(適宜置き換えて実行してください)

execDdl.sh
#!bin/bash

# 本ファイルのあるディレクトリへ移動
cd $(dirname $0)

# データセットの作成
echo 'データセットを作成します'
bq mk test_bq
# データセットができたことを確認
bq show test_bq
echo 'データセットの作成が完了しました'

# ddlディレクトリ下に配置したDDLを順に実行する
echo 'テーブル作成を開始します'
files='./ddl/*'
for file in $files
do
  # DDL記載ファイルの中身を変数: コメントがあるとうまく実行できないため削除する
  ddl=`cat $file | sed -e 's/--.*\$//g'`
  # DDLの実行
  bq query --use_legacy_sql=false $ddl
done
echo '全てのテーブル作成が完了しました'

# データセット配下のテーブル一覧を表示
echo 'テーブル一覧を表示します'
bq ls test_bq

ポイント

  • DDLファイルにコメント(「--」で記載)が入っていると、「FATAL Flags parsing error: Unknown command line flag '--xxx'」エラーが出てしまったため、sedコマンドにてコメントを削除する処理を入れました

実行DDL例

以下のように、コメントが入っていてもエラーなく実行できます

members.ddl
-- 会員情報テーブル
create table `test_bq.members` (
  member_id string not null
  , name string not null
  , regist_date date not null
  , sex string
  , birthday date
  , latitude float64
  , longitude float64
  , location geography -- BigQueryにはgeometry型がないのでgeography型を使う
  , citycode string
);

終わりに

DDLファイルをいちいち開いてコンソールから実行するの面倒だなー、とはいえDDL作ってしまったし、今更bq mk用に書き換えるのもなーということで、シェルスクリプトにしてしまいました

もっとよい方法があればぜひ教えてください!

参考

Discussion