🏷️
BigQueryのテーブルlabelを使ってテーブルメタ情報を最大限表示する
公開
2024-11-27
更新
2024-11-30
文章量
約2528字
相談料
5,000 円/時
imofessional
Webサービスを提供する日系企業でアナリティクスエンジニア(AE)/ データエンジニア(DE)をやっています!
この記事の概要
表題の通り、BigQueryのテーブルlabel機能を使い倒して、BQ上でテーブルに属性情報やOwner情報などのメタ情報を見れるようにする方法を考えた記事です!
BigQueryのlabelにテーブルメタ情報を追加できると何が嬉しいか
まず、データ利用者がBigQueryの画面を見るだけでテーブルの属性やOwnerの情報を知ることができるようになります
また、Information Schemaなどにも情報が連携されるようになるので、テーブルメタ情報とテーブルの利用状況などを掛け合わせてモニタリングできるようになります
BigQueryのlabel機能とは
テーブル詳細画面に表示される以下のようなもので、テーブルにメタ情報を付与することが可能です!

公式の説明を引用すると
ラベルは、Google Cloud BigQuery リソースに割り当てることができる Key-Value ペアです。ラベルはこれらのリソースを整理し、必要な粒度に基づいてコストを大規模に管理する場合に役立ちます。各リソースにラベルを設定し、そのラベルに基づいてリソースをフィルタできます。ラベルに関する情報は課金システムに転送され、請求料金をラベル別に分類できます。組み込みの請求レポートにより、リソースラベルで費用をフィルタしてグループ化できます。また、ラベルを使用して請求データ エクスポートをクエリすることもできます。
ということで主にコスト管理文脈で使用することを想定して存在する機能のようですが、リソースにKey-Valueの情報を付与できることから、テーブルメタ情報の付与としても使えるのではないかと考えました。
dbt yamlで管理するテーブルメタ情報
上記のパートで紹介したBQのlabel機能と組み合わせると相性が良さそうだったのがdbt yamlで管理しているテーブルメタ情報でした。dbtについては説明を割愛してしまいますが、yamlでテーブルの情報を管理しており、以下のような形式で情報を保持することができます。そのうち、tables配下の階層にmetaという階層を持つことができ、Key-Valueでテーブルのメタ情報を持つことができます。参照リンク
#source.yml内
sources:
- name: test_schema-test_table
database: test_database
schema: test_schema
tables:
-name: test_table
description: |-
###概要
このテーブルはテストです
meta:
owner: data_group
columns:
- name: id
data_type: STRING
description: ''
- name: name
data_type: STRING
description: ''
今回はこのdbt yaml上のmeta階層の情報をCDで自動的にBigQueryに反映しようと考えました。
BigQueryのラベルを追加したり削除したりするコマンド紹介
ラベルの追加や削除にはbq updateコマンドを使用します(GUIから手動で追加することももちろん可能です)
テーブルにラベルを追加するには--set_label
フラグを追加して以下のように記述します
bq update --set_label owner:data_group プロジェクト名:データセット名.テーブル名
逆にラベルを削除したい場合は--clear_label
フラグを追加して以下のように記述します
bq update --clear_label owner:data_group プロジェクト名:データセット名.テーブル名
ラベルのValueだけClearしたい場合は--clear_label
フラグを追加して以下のように記述します
bq update --clear_label owner:data_group プロジェクト名:データセット名.テーブル名
テーブルに対応するdbt yamlが更新されたら自動的にBigQuery上のlabelも更新したい
ここまで説明したきた方法でメタ情報を管理し、それをコマンドでBigQueryに表出させることができました。ここからはそれを手動でやるのではなくCDで自動で行う方法を考えていきます!自分のいる環境ではCDでテーブルのdescriptionを更新するところまではすでにできたいたので、その関数に組み込む形でlabelのアップデートも実装しました。処理の大まかな流れは以下になります
更新されたファイルに対応するdbt yamlファイルの一覧を取得し、それぞれに以下を適用する
bq showコマンドで対象となるテーブルにsetされているラベルを検出する
上記で取得したラベルをbq update --clear_labelの繰り返しで削除する
dbt yamlファイルを読み込みmetaの配下のkey:valueを取得する
上記で取得したkey:valueを--set_labelの繰り返しでラベルにsetする
細かい注意ポイントと工夫
連続でbq updateコマンドを投げるとエラーになるため,time.sleep(1)のような処理を間に挟む必要がある
labelのvalueに使える文字には制限があるため、英語の大文字などは小文字に置換する処理を組む必要がある
labelのvalueの文字数にも64文字までの制限がある
labelは一つのテーブルに64個までしかsetできないため、それを超える場合はfilterする必要がある(そんなにあることもない気もするが...)
bqコマンドはインデントとか注意しないとすぐにエラーになる