はじめに
BigQueryで外部テーブルのスプレッドシートの参照先URIを変更する場合、そのまま編集できないため不便です。 そこで、今回は外部テーブルのURIを変更するプログラムを作成しましたので、ご紹介します。
やりたいこと

外部テーブルのURIをColaboratoryで変える
プログラム
メモ
こちらをコピーして使用できます。
https://colab.research.google.com/drive/1uFh94Q40Ellbc_rr9WDCQkXEC_n9cp1f
コード解説
-
まずは、認証します
認証(実行後 authorization code をコピーして貼り付けEnter)
!gcloud auth login
1. 次に変数を指定します
```python
# プロジェクトを指定
PROJECT_ID="*my_project_id*"
# 対象のデータセットとテーブルを指定
dataset="*my_dataset*"
table="*my_table*"
# 変更先のスプレッドシートのURI
target_google_sheets_uri="https://docs.google.com/spreadsheets/d/*my_spread_sheet_key*"
-
対象テーブルのテーブル定義を出力しておきます
テーブル定義ファイルを出力
!bq show --format=prettyjson $PROJECT_ID:$dataset.$table > def.json
1. 先ほど出力したテーブル定義を使って新しいテーブル定義ファイルを作成します
```python
import json
# テーブル定義ファイルを読み込む
with open('./def.json', 'r') as f:
data = json.load(f)
schema = data.get("schema")
new_def = data.get("externalDataConfiguration")
# 新しいテーブル定義を作成
new_def.update({"schema": schema})
new_def.update({"sourceUris": [target_google_sheets_uri]})
with open("./new_def.json", 'w') as f:
json.dump(new_def, f, indent=2)
-
テーブルを更新します
元のテーブルを削除(実行後 y を入力してEnter)
!bq rm $PROJECT_ID:$dataset.$table
新しいテーブルを作成
!bq mk
--external_table_definition=new_def.json
$PROJECT_ID:$dataset.$table
これで、外部テーブルのURIが更新されます!
## 参考
公式のドキュメント
https://cloud.google.com/bigquery/docs/external-data-drive?hl=ja
テーブル定義の方法
https://cloud.google.com/bigquery/docs/external-table-definition?hl=ja#use-json-schema