クラスメソッド株式会社データアナリティクス事業本部所属のニューシロです。 今回はGoogle CloudのBigQueryについて、テーブル自動生成機能を使わない方法について調べました。
きっかけ
情報が簡単に見つからなかったので書いてみました。公式ドキュメントから発見!
環境
Cloud Shell エディタを使用しました。
本題
BigQueryにはとても親切な機能があります。それはテーブルの自動生成機能です。
BigQueryにデータをロードする際、データセット内にテーブルが見つからない場合はテーブルを自動生成してくれます。
試しにテーブルがない状態で、以下のPythonコードを実行してみます。load_table_from_json
を使ってBigQueryへ簡単なデータをロードするコードです。存在しないテーブルを対象にしているのですが、なんと自動でテーブルを生成してくれた後にロードしてくれます。非常にありがたい!
- 参照 : load_table_from_json
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
を変更するようです。公式ドキュメントから見つけることができました。
- 参照 : 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"
を設定しましょう。 - 公式ドキュメントは頼りになります。
以上です。ここまでお読みいただきありがとうございました。