サインアップ

ログイン

パスワードをお忘れですか

パスワードを忘れましたか? メールアドレスを入力してください。 リンクを受け取り、メールで新しいパスワードを作成します。

質問するにはログインする必要があります

BQのメタデータ(スキーマ定義etc)をPythonで更新する方法(update_table)

【概要】

・下図のように、pythonからBQフィールド名(日本語)を「説明」の部分に格納
・BQスキーマに対して「update_table」処理を行う。そのpythonライブラリとして「from google.cloud import bigquery」を活用

【補足】

・Pythonの実行環境は「Anaconda」や「Google Colaboratory」など
・PythonからBQへアクセスする際、認証が必要
 →from google.oauth2 import service_account*下記、参照
・今回、郵便局オープンデータをBQテーブル化したもの(英語名のみ)に対して、説明フィールドに日本語名を追加する

【完成形】

【Pythonライブラリ】

「from google.cloud import bigquery」はPythonからBQを操作するライブラリ
 →BigQuery API クライアント ライブラリ
 →pip install --upgrade google-cloud-bigquery

from google.oauth2 import service_accountはPythonから認証を操作するライブラリ
 →PythonプログラムでGoogle認証してGoogleのサービスを利用する
 →pip install -U google-auth

【ポイント】

以下、サンプルコード内の箇所で「フィールド名=項目物理名」や「TIPE=型」そして、肝心の「説明=description」などを指定

bigquery.SchemaField(“JIS_code_of_the_location_of_large_offices”, “INTEGER”, mode=”NULLABLE”, description=’大口事業所の所在地のJISコード’),

【サンプルコード】

# update_schema.py

from google.cloud import bigquery
from google.oauth2 import service_account

# サービスアカウントのJSONキーファイル呼び出し
credentials = service_account.Credentials.from_service_account_file(
filename= './key/testdb-*******.json',
scopes=['https://www.googleapis.com/auth/cloud-platform']
)

# プロジェクト情報
project_id = 'testdb'
client = bigquery.Client(
credentials=credentials,
project=credentials.project_id,
)

# テーブル情報
table_id = 'opendata.post_office'
table = client.get_table(table_id)

# スキーマ情報
print( 'schema: {}'.format(table.schema) )
schema = [
bigquery.SchemaField("JIS_code_of_the_location_of_large_offices", "INTEGER", mode="NULLABLE", description='大口事業所の所在地のJISコード'),
bigquery.SchemaField("Large_office_name_Kana", "STRING", mode="NULLABLE", description='大口事業所名(カナ)'),
bigquery.SchemaField("Large_office_name_Kanji", "STRING", mode="NULLABLE", description='大口事業所名(漢字)'),
bigquery.SchemaField("Prefecture_name_Kanji", "STRING", mode="NULLABLE", description='都道府県名(漢字)'),
bigquery.SchemaField("City_name_Kanji", "STRING", mode="NULLABLE", description='市区町村名(漢字)'),
bigquery.SchemaField("Town_area_name_Kanji", "STRING", mode="NULLABLE", description='町域名(漢字)'),
bigquery.SchemaField("Koaza_name_chome_street_address_etc_Kanji", "STRING", mode="NULLABLE", description='小字名、丁目、番地等(漢字)'),
bigquery.SchemaField("Large_office_individual_number", "INTEGER", mode="NULLABLE", description='大口事業所個別番号'),
bigquery.SchemaField("Old_zip_code", "INTEGER", mode="NULLABLE", description='旧郵便番号'),
bigquery.SchemaField("Handling_Bureau_Kanji", "STRING", mode="NULLABLE", description='取扱局(漢字)'),
bigquery.SchemaField("Display_of_individual_number_type", "INTEGER", mode="NULLABLE", description='個別番号の種別の表示'),
bigquery.SchemaField("Presence_or_absence_of_multiple_number", "INTEGER", mode="NULLABLE", description='複数番号の有無'),
bigquery.SchemaField("Modification_code", "INTEGER", mode="NULLABLE", description='修正コード'),
]
table.schema = schema

# テーブル更新
table = client.update_table( table, ['schema'] )

# (最新の)テーブル・スキーマ情報
table = client.get_table(table_id)
print( 'schema: {}'.format(table.schema) )

関連記事

コメントを残す