ハイサイ!社内向けデータ分析基盤の開発者です。
目的: メタデータカバレッジの可視化
snowflake + dbtのデータ基盤を運用しています。データカタログを充実させて全社のデータ利活用促進するために、メタデータのカバレッジ向上をやってます。現状把握と効果測定のために、まずカバレッジを可視化します。
メタデータとは
メタデータはデータを説明するデータです。例えばデータモデルの内容や用途。うちではデータモデルと同じ名称のYMLファイルでやってます。
このYMLには、meta, tags, descriptionなどいろいろありまして、それぞれの使い道がありますが、この記事で言ってる「メタデータカバレッジ」は「descriptionの記載率」のことを指します。
方法: dbt_columns.descriptionの記載割合を計算
elementaryを導入したから、dbtの実行結果について何種類のテーブルはsnowflakeへ配置されています。
その中にdbt_columnsというテーブルがありまして、buildしたデータモデルの各カラムの情報を格納しています。このdbt_columnsにdescriptionという列があり、この列は、各カラムのdescriptionをそのまま持ってきます。descriptionがnullでもなく空でもないレコード数の割合でメタデータのカバレッジを測ります。
結果: 100%なんて!
一回測ってみたら結果100%です。え?と思って公式ドキュメンを見たら、dbt_columnsについて以下の記載がある:
Data about all the columns that are documented in the yml files.
つまりdocumentedしてないcolumnsはこのdbt_columnsにそもそも存在しない。
解決: 公式にないconfig設定
理想の状態はdbt_columnsにすべてのcolumnsが存在することです。
そもそもdocumentedとは何でしょう。
ソースコードを読むと、こういう条件でdocumented columnsをフィルターしてることが分かりました。
48: {% if elementary.get_config_var('columns_upload_strategy') == 'all' or column_node.get('description') or has_meta or has_tags %}
configのcolumns_upload_strategyがallに設定してるならいいけど、そうじゃない場合descriptionかmetaかtagsかどれ一つ記載のある場合documentedとして判断するよね。それはdocumentedの意味か。
columns_upload_strategy
を公式ドキュメンで検索したら結果なかったが、gitで検索した結果:
35: 'columns_upload_strategy': 'enriched_only',
ということでdbt_project.yml(dbtの設定ファイル)のvarsの部分に以下を追記しました。そして解決しました。
elementary:
columns_upload_strategy: "all" # contains all columns even without description into dbt_columns
elementaryのバージョンによってこのconfigが違います。
v0.16.2まで、upload_only_columns_with_descriptions
でしたの。v0.16.2までのelementaryを使ってる場合、varsにupload_only_columns_with_descriptions: false
を追記することになります。
終わり
ソースコードを読めば簡単に解決するもんですが、実は本件に一番難しかったことは、ソースコードの場所を見つかることです。公式ウェブサイトにChatGPTみたいなダイアログがありまして、そこでいろいろ聞き方を変えたりしてやっと言わせた。使ってみてくださいね!
では再見(ツァイチエン)!