テックブログ

エルカミーの技術ブログです

BigQuery の外部参照テーブル先を変更する

はじめに

BigQueryで外部テーブルのスプレッドシートの参照先URIを変更する場合、そのまま編集できないため不便です。

そこで、今回は外部テーブルのURIを変更するプログラムを作成しましたので、ご紹介します。

やりたいこと
image block
外部テーブルのURIをColaboratoryで変える

プログラム
📌
こちらをコピーして使用できます。
コード解説
  1. まずは、認証します
    # 認証(実行後 authorization code をコピーして貼り付けEnter)
    !gcloud auth login
  2. 次に変数を指定します
    # プロジェクトを指定
    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"
  3. 対象テーブルのテーブル定義を出力しておきます
    # テーブル定義ファイルを出力
    !bq show --format=prettyjson $PROJECT_ID\:$dataset\.$table > def.json
  4. 先ほど出力したテーブル定義を使って新しいテーブル定義ファイルを作成します
    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)
  5. テーブルを更新します
    # 元のテーブルを削除(実行後 y を入力してEnter)
    !bq rm $PROJECT_ID\:$dataset\.$table
    
    # 新しいテーブルを作成
    !bq mk \
    --external_table_definition=new_def.json \
    $PROJECT_ID\:$dataset\.$table

これで、外部テーブルのURIが更新されます!

参考

公式のドキュメント

テーブル定義の方法