dbtでデータパイプラインを書いていると、必ずある作業が地味に時間を取ります。schema.ymlのdescription入力です。「customer_id」は顧客ID、「order_total」は注文金額、と同じカラムをBronze→Silver→Goldで何度も説明する必要があります。実装よりドキュメント整理の方が時間がかかる、という本末転倒もよくあります。

dbt-osmosisは、この問題を「上流のdescriptionを下流に自動継承する」アプローチで解決するOSSです。Z3Z1ed Loedeman氏らが中心となって開発、いまや多くのdbt組織で標準ツールになっています。基本機能と運用設計を整理します。

主要機能

機能役割
description継承上流の同名カラムからdescriptionを下流に伝播
schema.yml自動生成未定義モデル・カラムのスケルトンを自動作成
yml構造の標準化schema.ymlのフォーマットを統一
未使用カラム検知schemaに書かれていない実カラムを検出
Workbench UIGUIでschema.ymlを編集する補助インターフェース

最小の使い方

# インストール
pip install dbt-osmosis

# プロジェクトでschema.ymlを整える
dbt-osmosis yaml refactor --project-dir . --profiles-dir ~/.dbt

# 上流からdescriptionを継承
dbt-osmosis yaml propagate --project-dir . --profiles-dir ~/.dbt

`refactor`はschema.ymlの構造化、`propagate`はdescription継承。CIで両方を流すと、dbtプロジェクトのドキュメント状態は常にきれいに保たれる。

継承の動作例

# models/silver/orders.yml(上流)
version: 2
models:
  - name: silver_orders
    columns:
      - name: customer_id
        description: "顧客の一意識別子。CRM上のcustomer.id"
      - name: order_total
        description: "注文金額の合計(税込)"
# models/gold/fct_orders_daily.yml(下流、refactor前)
version: 2
models:
  - name: fct_orders_daily
    columns:
      - name: customer_id
      - name: order_total
      - name: order_count
# dbt-osmosis propagate 実行後
version: 2
models:
  - name: fct_orders_daily
    columns:
      - name: customer_id
        description: "顧客の一意識別子。CRM上のcustomer.id"
      - name: order_total
        description: "注文金額の合計(税込)"
      - name: order_count
        # 上流に無いカラムは継承されない

下流の同名カラムに、上流のdescriptionが自動的に入る。「同じ意味のカラムは同じ説明」という運用ルールが、ツール側で強制される。

運用パターン

パターン運用
CI自動実行PRごとにrefactor + propagateを自動実行
pre-commit hookコミット時にschema.ymlを整形
定期的なバッチ週次でプロジェクト全体を整形
初回大規模整理レガシーdbtプロジェクトの初期改善

CIで自動実行するのが最も効果が高い運用。「PRレビュー時にschema.ymlが整っていない」という典型的な揉め事が、ツールで自動解決される。

運用上のハマりどころ

  • 自動継承の正しさは保証されない:上流が間違っていれば、下流も同じ間違いを継承する。レビュー文化との組み合わせが前提。
  • カラム名の意味のずれ:上流の「amount」と下流の「amount」が違う意味(税抜きvs税込みなど)の場合、誤った継承を生む。命名規約での予防が必要。
  • dbt本体バージョンへの依存:dbt-osmosisはdbtの内部APIに依存。dbtメジャーバージョン変更時に挙動確認が必須。
  • 大規模プロジェクトの初回実行:propagate初回は大量変更が生じる。レビュー可能な単位に分けて段階的に実行。

向く・向かない場面

  • 向く:dbtで多数のレイヤーを運用、schema.ymlのdescription整備が日常的な作業、組織で一貫したカラム説明を持ちたい
  • 向かない:小規模で5〜10モデル程度、業務文脈ごとにdescriptionが大きく違うべき領域、dbt未使用

まとめ

  • dbt-osmosisは上流descriptionを下流に自動継承するOSS。
  • schema.ymlの整形、未定義スケルトン生成、未使用カラム検知も対応。
  • CI自動実行・pre-commit hookでの運用が効果的。
  • 誤った継承を防ぐため、レビュー文化と命名規約と組み合わせる。
  • 中〜大規模dbtプロジェクトでドキュメント運用を劇的に楽にする。

全体像はdbt周辺ツール選定、隣接はdbt-checkpoint とはSQLMesh vs dbt。dbt周辺整理の壁打ちは、DE-STKの初回相談(30分・無料)もご利用ください。

よくある質問(FAQ)

Q. dbt-osmosisを入れるタイミングは?

A. dbtプロジェクトのモデル数が50を超えたあたりから恩恵が大きくなります。小規模ならschema.ymlを手動で書く方が制御が効きます。「同じカラムを3層以上で説明している」「PRレビューでdescription指摘が多発」がシグナルです。

Q. カタログツール(DataHub等)との関係は?

A. dbt-osmosisで整えたschema.ymlのdescriptionは、そのままカタログツールに反映されます。「カタログに良いdescriptionを載せる」前提として、schema.ymlを整えるdbt-osmosisが有用です。カタログの選定はデータガバナンスとカタログを参照してください。

Q. propagate実行後のdiffが大きすぎてレビューが大変

A. 初回実行時のあるあるです。プロジェクト全体ではなく、モデル単位(–select オプション)で段階的に実行し、PRを小分けにすると現実的です。「Bronze層から始めて、Silver、Goldと進める」という順序が、レビュー負担を分散できます。

Q. 業務文脈ごとにdescriptionを変えたい場合は?

A. propagateで「下流のdescriptionが既にある場合は上書きしない」モードを使えば、明示的に上書きした下流のdescriptionは保持されます。「基本は自動継承、業務文脈で必要なら手動で上書き」の併用が現実的です。

▼ このトピックをポチポチ学ぶ

dbtを深く使いこなす

関連記事を順序立てて読みながら、ステップごとに4択クイズで理解を確認できる学習パスです。登録不要・進捗自動保存。

学習パスを始める →