はじめに
どうも、@to-fmakです。最近BigQueryに作成されたビューの情報のバックアップを取得する必要があったので、その方法について共有できればと思います。
やりたいこと
BigQuery 内に複数のビューが存在しており、移行作業などに伴い、以下の情報のバックアップを取得したい
- データセットのメタデータ
- 各ビューのスキーマ情報
- 各ビューのクエリ定義
これらをファイルとして出力し、Cloud Storageなどに保存できるようにしたい
対応方法
データが格納されたテーブルの場合、Cloud Storage へのエクスポート機能を利用できます。しかし、ビューの場合はbqコマンドラインツールや SDKを使って情報を取得し、ファイルに保存する必要があります。
今回はCLIで実施します。(CloudShellから実行)
CLIでの情報取得
以下のコマンドで、データセットのメタデータやビューの情報を取得できます。
# データセットのメタデータを取得
bq show --format=json <PROJECT_ID>:<DATASET_ID>
# スキーマやクエリなどを含めたビューの情報を取得
bq show --format=prettyjson <PROJECT_ID>:<DATASET_ID>.<VIEW_ID>
スクリプト化
対象データセット内の複数のビュー情報を一括で取得する必要があったので、上記のコマンドをもとにシェルスクリプトを作成しました。
#!/bin/bash
# プロジェクトとデータセットを指定
PROJECT_ID="xxxx"
DATASET_ID="$1"
# ディレクトリ作成
mkdir -p "$DATASET_ID"
# データセットのメタデータをエクスポート
bq show --format=json $PROJECT_ID:$DATASET_ID > $DATASET_ID/dataset_metadata.json
# データセット内の全テーブルとビューをリスト
bq ls --format=json $PROJECT_ID:$DATASET_ID > $DATASET_ID/tables_list.json
export_view_queries() {
# bq lsの出力から各ビュー名を取得し、エクスポート
bq ls $PROJECT_ID:$DATASET_ID | tail -n +3 | while read -r line; do
# lineから最初のカラム(tableId)を抽出
TABLE_ID=$(echo "$line" | awk '{print $1}')
# ビューの場合のみエクスポート
if [[ "$line" == *"VIEW"* ]]; then
echo "Exporting view: $TABLE_ID"
# ビューの情報を取得
bq show --format=json "$PROJECT_ID:$DATASET_ID.$TABLE_ID" > "${DATASET_ID}/${TABLE_ID}_view_details.json"
fi
done
}
export_view_queries
上記スクリプトでは、DATASET_IDをコマンド引数から渡すようにしています。また、ビュー情報取得する際に、対象データセット内の全テーブルとビューをリストアップし、ビューの場合のみエクスポートするようにしています。
./export_view_info.sh <データセット名>
スクリプトを実行すると、<データセット名>/のディレクトリが作成され、取得したメタデータやビュー情報が格納されます。このディレクトリをCloud Storageなどにアップロードすることでバックアップとして活用できます。
あくまで一例なので、実際に利用する際は要件に応じてカスタマイズしていただければと思います。
エンジニア募集
Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!
ぜひお気軽にカジュアル面談へお越しください!!