指標は最終成果物ではなく、意思決定のための契約です。定義場所と計算方法がブレると、BIの数字がツールごとにズレます。本稿では、dbtにおける指標定義の選択肢を、モデルによる集約とSemantic Layerによる統一定義の両面から整理します。
dbt公式の機能はバージョンで変遷があります。特に旧来のmetricsリソースは非推奨方向で、現在はdbt CloudのSemantic Layer(MetricFlowベース)が推奨です。資格対策では、安定して問われやすい概念(粒度、テスト、系譜、ガバナンス)に軸足を置きつつ、新旧の位置づけを押さえておきましょう。
dbtでの指標の置き場所は、大きく2つに分かれます。ひとつは集約済みのマートモデルを作る方式、もうひとつはSemantic Layerでmeasureとmetricを宣言して下流ツールから呼び出す方式です。前者はどのDWHでも動く普遍性、後者は定義の一元化と接続先での再利用性に強みがあります。
現場では、まず事実テーブルとディメンションの正規化、時間粒度の統一、フィルタ条件の合意を済ませてから、どちらの方式を選ぶかを決めるのが堅実です。
指標の系譜と利用の流れ
マート層で事実テーブルを整備し、AOVやCVRなどの指標をビュー/テーブルとして提供する方法です。どのDWHでも使え、dbt Coreのみで完結するため、試験でも本流として問われやすいです。
ポイントは一貫した粒度管理と、集約ロジックの再利用です。たとえば日次・週次・月次と3つ作るのではなく、最小粒度(日次)を基本に、下流でロールアップ可能な形に保ちます。
dbt CloudのSemantic Layer(MetricFlowベース)では、semantic_modelsでエンティティ・ディメンション・メジャーを宣言し、metricsで指標を組み立てます。BIやノートブックがこの層を経由することで、ツール間の指標不一致を防げます。
仕様やキーワードはバージョンで更新されることがあるため、実装前に公式ドキュメントを確認してください。概念としては、measure(集計対象の定義)とmetric(利用者向けのビジネス指標)を分離し、time grainやディメンション、フィルタの既定を明示します。
| アプローチ | 定義場所/管理 | 主な利点 | 注意点 |
|---|---|---|---|
| 手書き集約モデル(SQL) | dbt Coreのモデル(marts層) | DWH非依存・シンプル・運用が容易 | 粒度やフィルタの乱立に注意。BIごとの差分管理が必要 |
| 旧metricsリソース(非推奨) | YAMLのmetrics定義(旧仕様) | 一時期のdbt Coreで簡易に定義可能 | 現在は非推奨。新規はSemantic Layerへ移行推奨 |
| Semantic Layer(MetricFlow) | semantic_models と metrics(dbt Cloud) | 定義一元化・ツール横断の再利用・メトリクスガバナンス | Cloud依存、仕様更新への追随が必要 |
Semantic Layerの例: semantic_models と metrics のYAML
semantic_models:
- name: orders
model: ref('fct_orders')
entities:
- name: order
type: primary
expr: order_id
- name: customer
type: foreign
expr: customer_id
dimensions:
- name: order_date
type: time
type_params:
time_granularity: day
- name: channel
type: categorical
measures:
- name: orders
agg: count
- name: gross_revenue
agg: sum
expr: gross_amount
metrics:
- name: total_revenue
type: simple
label: Total Revenue
type_params:
measure: gross_revenue
- name: aov
type: ratio
label: Average Order Value
type_params:
numerator: gross_revenue
denominator: orders
filter: channel != 'internal'
time_granularity: day壊れない指標は、粒度の明示、入力データ品質の担保、そしてドキュメントの3点で決まります。特に日付とエンティティの組で一意になるかを最初に確認し、nullや遅延到着を想定した設計にします。
テストはstgとmartsの両方に配置します。stgではスキーマ整合と重複排除、martsではキーの一意性、結合の完全性、受け入れ値の検証を行います。Semantic Layerを使う場合でも、土台のモデルテストは省略しません。
モデル方式では、集約ビューをBIが直接参照します。Semantic Layer方式では、対応コネクタやAPIを介してmetricを指定して取得します。どちらでも、権限設計とキャッシュ戦略を合わせて考えておくとパフォーマンスが安定します。
ダッシュボードはexposuresでdbtプロジェクトに登録し、上流変更の影響を可視化します。リリース前に該当exposureに対するデータ検証を自動実行すると、指標の破壊的変更を早期に検知できます。
Analytics Engineer試験では、定義の一貫性とデータ品質に関する原則が狙われます。具体プロダクトの細部仕様は変わる可能性があるため、概念の優先順位で判断できるようにしておきましょう。
ひっかけとして多いのは、BIツールごとの計算フィールド乱立や、粒度の不一致による比率の誤差です。分母・分子が同じフィルタと粒度で計算されているかを常に確認します。
Analytics Engineer
問題 1
組織全体でAOV(平均注文額)をツール横断で一貫提供したい。DWHは複数、BIも複数種類が並行稼働している。再利用性とガバナンスを最も両立できるアプローチはどれか。
正解: A
ツール横断の一貫性と再利用性を最も担保できるのはSemantic Layerでの定義一元化。BI側の計算や複数粒度の乱立、RAWへの焼き込みはメンテ困難や定義逸脱の温床になりやすい。
旧来のdbt metricsリソースは使ってよいですか?
現在は非推奨方向です。新規はdbt CloudのSemantic Layer(MetricFlow)での定義を検討してください。既存プロジェクトの移行は、measureとmetricの対応関係を整理し、粒度・フィルタの既定を明記したうえで段階的に行うのが安全です。詳細はdbt公式ドキュメントの最新ガイダンスを参照してください。
DWHやBIが混在しています。どの方式が安全ですか?
移植性最優先ならモデル方式(dbt SQLでの集約ビュー)が堅実です。一方で組織横断の一貫性と再利用を最大化したいならSemantic Layerが有力です。どちらにせよ、土台のstg/martsの品質テストと粒度の統一が前提です。
パフォーマンスはどう考えますか?
モデル方式ではマテリアライズ(table/incremental)と集約の事前計算を活用します。Semantic Layerではコネクタ側の最適化とDWHの統計・パーティションを活かします。どちらでも、日付ウィンドウの再計算範囲を適切に制限し、コストの高いディメンション結合を事前に正規化するのが有効です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
dbt Model の基礎: SQL で定義する変換の最小単位
Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...
dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点
dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...
dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点
dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...
dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト
Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....
dbt_project.yml の読み方:主要設定と命名を最短で掴む
dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...