4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

dbt-osmosisリファクタリング、model名重複時の動作仕様

Last updated at Posted at 2025-03-19

 ハイサイ!社内向けデータ分析基盤の開発者です。

背景

 メタデータYMLを作成、更新する時、dbt-osmosis yaml refactorがとても助かります。上流のモデルのメタデータを継承し下流のモデルのメタデータYMLへ反映(伝播と呼ばれる)してくれるので、手作業での入力工数を削減できます。
 上流のモデルのメタデータを取得する際に2つ方法があります。

  1. 直接データベースへアクセスしてメタデータを取得する
  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のみです。そのため先に読み込んだモデルの方のメタデータが後に読み込んだモデルのメタデータにも反映されてしまいます。意図しないメタデータの上書きが発生してしまいます。

1.png
2.png

データベースから取得する時

 カラム情報を洗い出す時にキーとしてdatabase.schema.model nameの組み合わせを使います。model nameだけ重複でも誤って別のモデルのメタデータが適用されることはありません。
3.png

終わり

 データ連携元のシステム仕様によっては、データベースに名称が同じのモデル、2つ以上存在することがあり得ます。データベースへ直接アクセスする時は大丈夫ですが、catalog.jsonからメタデータを取得するような実装を行う場合、、、、気をつけましょう。
 では再見(ツァイチエン)!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?