ハイサイ!社内向けデータ分析基盤の開発者です。
背景
メタデータYMLを作成、更新する時、dbt-osmosis yaml refactor
がとても助かります。上流のモデルのメタデータを継承し下流のモデルのメタデータYMLへ反映(伝播と呼ばれる)してくれるので、手作業での入力工数を削減できます。
上流のモデルのメタデータを取得する際に2つ方法があります。
- 直接データベースへアクセスしてメタデータを取得する
-
--catalog-path
オプションを使ってcatalog.jsonからメタデータを取得する
用語:model nameとモデル
この記事にmodel nameとモデル、という2つ用語混ざって使ってますが、それぞれの定義を下記メタデータYMLの例で説明します。
前提としてデータベースにはaccountというモデル(テーブルかもしれないし、ビューやソースかもしれない)が存在します。この例だと、モデルはデータベースに存在するaccountを指しています。model nameはこのYMLの中のmodelsブロックにあるnameの値accountを指します。
version: 2
models:
- name: account
columns:
- name: ID
description: 'アカウントID'
data_type: TEXT
dbt-osmosis yaml refactor
を使うと、このYMLにあるaccountモデルの各カラム(IDなど)のメタデータ(「アカウントID」というdescription)が下流モデルのYMLへ自動的に更新します。
名称重複のモデルがあるとき、二つ方法の仕様相違点
公式ドキュメントに明記されていませんが、実はデータベースから取得する場合とcatalog.jsonから取得する場合、伝播の仕様に違いがあります。
ソースコードはこちらです👉 dbt_osmosis/core/osmosis.py
catalog.jsonから取得する時
カラム情報を洗い出す時に使うキーはmodel nameのみです。そのため先に読み込んだモデルの方のメタデータが後に読み込んだモデルのメタデータにも反映されてしまいます。意図しないメタデータの上書きが発生してしまいます。
データベースから取得する時
カラム情報を洗い出す時にキーとしてdatabase.schema.model name
の組み合わせを使います。model nameだけ重複でも誤って別のモデルのメタデータが適用されることはありません。
終わり
データ連携元のシステム仕様によっては、データベースに名称が同じのモデル、2つ以上存在することがあり得ます。データベースへ直接アクセスする時は大丈夫ですが、catalog.jsonからメタデータを取得するような実装を行う場合、、、、気をつけましょう。
では再見(ツァイチエン)!