【概要】
・下図のように、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 bigqueryfrom 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) )
コメントを残す