こちらの記事でも登場しました、後輩さんのやり方を紹介するの会、その2です。
後輩のやりかたをパクって記事にするとかどうなのよ、という声が方々から噴出しそうですが、彼は「こんなの朝飯前、紹介するまでもない」と思っているでしょうから(というかそんなことすら思ってないまである)、凡夫である私めが代わりにご紹介させていただく次第でございます。
今回はMatillionのpythonコンポーネントで、BigQeuryテーブルからカラム名を取得するやりかたのご紹介です。こんなことができて何が嬉しいかというと、列名をもとに自由にクエリを発行できる点にあります。この使い先に関しては別記事にてご紹介する予定です。
では早速説明していきましょう
例として、こちらのBigQuery用Google Analyticsサンプルデータセットを利用します。
https://support.google.com/analytics/answer/7586738
カラム構造は以下のような感じです。
MatillionのOrchestration Jobで、pythonコンポーネントをセットしましょう
中身はこんな感じ(下図)。まず、BigQuery APIのクライアントライブラリを呼び出し、get_table(‘テーブル名’)メソッドでテーブルの情報を取得、それをtabe_infoに入れておきます。(MY_PROJECT, MY_DATASET_ID, TABLE_NAMEはMatillion上の変数)
https://cloud.google.com/bigquery/docs/reference/libraries#client-libraries-install-python
import google.cloud.storage
from google.cloud import bigquery
client = bigquery.Client()
table_info = client.get_table(f'{MY_PROJECT}.{MY_DATASET_ID}.{TABLE_NAME}')
for schema in table_info.schema:
if schema._properties['type'] == 'INTEGER':
print(schema._properties['name'])
次にループを回してるところなんですが、table_info.shemaでスキーマ、つまりカラムに関してのループを回していることになります。ループは各カラム(BigQuery上では「フィールド」と呼称)ごとに回ってる感じです。
最後に、ループの中身について。shema._propertiesの中にそれぞれにカラムの情報が収まっておりまして、例えばshema._properties[‘name’]でカラム名称を、shema._properties[‘type’]でカラムの型をそれぞれ取得することが可能です。
つまり、欲しいもの(=テーブルのカラム名)はこれで手に入ったことになります。
また、特に今回の例では、ループ内if文でshema._properties[‘type’]==’INTEGER’としており、INTEGER型のテーブル名だけが出力されてきます。
出力結果はこんな感じ。確かにINTEGER型のカラムだけが出力されてますね〜
とまあ、今回はこんな感じでMatillionのpythonコンポーネントでBigQueryのカラム名を取得する方法を紹介しました。とはいえぶっちゃけこれだけだと、使い道のイメージがつかないと思います。なので別記事で、今回紹介した方法を使って、拡張性の高いクエリを発行するやり方をご紹介できればなと。