[メモ]BigQueryでテーブルの自動生成をオフにしてみた
クラスメソッド株式会社データアナリティクス事業本部所属のニューシロです。 今回は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()
↓ 結果
テーブルを自動生成してくれ、しっかりデータもロードされています!
、、、のですが、、、例えばこのコードが、既にあるテーブルにデータを追記するという前提で書かれているとしたら、テーブルが見つからない場合は自動でテーブルを生成せずにエラーを出力してほしいですね。
テーブルの自動生成をオフにする場合はLoadJobConfig
のcreate_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"
を設定しましょう。 - 公式ドキュメントは頼りになります。
以上です。ここまでお読みいただきありがとうございました。