[メモ]BigQueryでテーブルの自動生成をオフにしてみた

ありがたい機能です。でも、オフにしたいときもあります。
2023.05.26

クラスメソッド株式会社データアナリティクス事業本部所属のニューシロです。 今回はGoogle CloudのBigQueryについて、テーブル自動生成機能を使わない方法について調べました。

きっかけ

情報が簡単に見つからなかったので書いてみました。公式ドキュメントから発見!

環境

Cloud Shell エディタを使用しました。

本題

BigQueryにはとても親切な機能があります。それはテーブルの自動生成機能です。
BigQueryにデータをロードする際、データセット内にテーブルが見つからない場合はテーブルを自動生成してくれます。

試しにテーブルがない状態で、以下のPythonコードを実行してみます。load_table_from_jsonを使ってBigQueryへ簡単なデータをロードするコードです。存在しないテーブルを対象にしているのですが、なんと自動でテーブルを生成してくれた後にロードしてくれます。非常にありがたい!

from google.cloud import bigquery


client = bigquery.Client()

# ロードするデータ
json_rows = [
    {"id": 1, "name": "dog"},
    {"id": 2, "name": "cat"},
    {"id": 3, "name": "bird"}
]

# テーブル"test_devio"はまだ存在しない
table_id = "new-shiro.developersio.test_devio"

job_config = bigquery.LoadJobConfig()
job_config.schema = [
        bigquery.SchemaField("id", "INTEGER"),
        bigquery.SchemaField("name", "STRING"),
]

load_job = client.load_table_from_json(
    json_rows=json_rows,
    destination=table_id,
    job_config=job_config
)

load_job.result()

↓ 結果

テーブルを自動生成してくれ、しっかりデータもロードされています!

、、、のですが、、、例えばこのコードが、既にあるテーブルにデータを追記するという前提で書かれているとしたら、テーブルが見つからない場合は自動でテーブルを生成せずにエラーを出力してほしいですね。

テーブルの自動生成をオフにする場合はLoadJobConfigcreate_dispositionを変更するようです。公式ドキュメントから見つけることができました。

先ほどのコードに、
job_config.create_disposition = "CREATE_NEVER"を追記しましょう。

from google.cloud import bigquery


client = bigquery.Client()

# ロードするデータ
json_rows = [
    {"id": 1, "name": "dog"},
    {"id": 2, "name": "cat"},
    {"id": 3, "name": "bird"}
]

# テーブル"test_devio"はまだ存在しない
table_id = "new-shiro.developersio.test_devio"

job_config = bigquery.LoadJobConfig()
job_config.schema = [
        bigquery.SchemaField("id", "INTEGER"),
        bigquery.SchemaField("name", "STRING"),
]
# 追記
job_config.create_disposition = "CREATE_NEVER"

load_job = client.load_table_from_json(
    json_rows=json_rows,
    destination=table_id,
    job_config=job_config
)

load_job.result()

実行するとNot found: Table new-shiro:developersio.test_devio was not found in location asia-northeast1とエラーメッセージが出て、テーブルも作成されませんでした!

create_dispositionはデフォルトでcreate_disposition = "CREATE_IF_NEEDED"となっているので、オフにしたい場合はこのように追記しましょう。

まとめ

  • テーブル自動生成のオフはcreate_disposition = "CREATE_NEVER"を設定しましょう。
  • 公式ドキュメントは頼りになります。

以上です。ここまでお読みいただきありがとうございました。

引用・参照まとめ