dbt

dbt の source() 関数を正しく使う:Sources のメリットと試験対策

2026-04-19
NicheeLab編集部

dbt で生データを参照するとき、直接テーブル名を書かずに source() を使うのが定石です。これは見た目の書き方の違いだけでなく、環境可搬性、ドキュメント、リネージ、テスト、新鮮度管理まで効く重要な選択です。

本記事では、dbt の Sources 定義と source() 関数の基本、導入メリット、定義のベストプラクティス、テストと新鮮度チェック、運用パターン、資格試験で問われやすい観点をまとめます。

source() の基本と役割

source() は、dbt で管理していない外部テーブル(生データなど)を参照するための Jinja 関数です。呼び出しは source('source_name', 'table_name') の2引数で、両者は YAML の sources 定義で宣言した name に一致します(実テーブル名が別名なら identifier でマッピングします)。

ref() は dbt がビルドするモデル間の依存を表現し、source() は外部データに対する依存を表現します。どちらも dbt のリネージグラフに反映され、コンパイル時に正しいデータベース・スキーマ・テーブル名へ解決されます。

  • 使いどころ: DWH に既存の生テーブル(例: 原始ログ、SaaS 連携テーブル)を参照するモデル
  • 避けるべき: 外部テーブルをスキーマ付きで直書き(環境差分に弱く、リネージに載らない)
  • YAML 上の name と実テーブル名の差異は identifier で吸収(リネージの可読性を確保)

リネージの全体像(Sources → Staging → Marts)

raw (source)orders_raw (id...)stg_orders (model)source('raw','orders_raw')dim_ordersref('stg_orders')

Sources を使うメリット(環境可搬性・リネージ・テスト・新鮮度)

Sources を定義して source() で参照すると、環境に依存しない解決、リネージとドキュメントの自動生成、ソースレベルのテストと新鮮度チェック、権限や命名の差異吸収(identifier)が一度に得られます。これは実務でも試験でも最頻出の評価ポイントです。

特に新鮮度(freshness)は Sources 特有の機能で、最新取り込み時刻を監視し、遅延を早期検知できます。可観測性の起点として Sources をきちんと定義しておくのが中長期のコスト最適です。

  • 環境可搬性: database/schema の差異を YAML で吸収、Jinja は常に source() で統一
  • リネージ・ドキュメント: dbt docs に Sources と依存関係が反映される
  • テスト: not_null, unique 等のテストをソース列に付与可能
  • 新鮮度: warn_after / error_after と filter で監視対象を制御可能
手法主目的環境可搬性リネージ/ドキュメント
source()外部テーブル参照高い(YAMLで解決)反映される(Sourcesとして)
ref()dbtモデル参照高い(アダプタが解決)反映される(モデルとして)
スキーマ直書き一時的な参照低い(環境依存)反映されない

定義方法とベストプラクティス

Sources は schema.yml(version: 2)で宣言します。source: name は論理名、tables[].name は source() の第2引数で使う論理名です。実テーブル名が異なる場合は identifier を指定します。database や schema は target ごとに上書きされる戦略(env/vars)を併用することも多いです。

ベストプラクティスとして、raw のような着地点ごとに source を分け、説明やオーナー、読み取り権限の所在を docs ブロックや meta に明記します。外部システム起因の取り込み遅延がある場合は freshness の filter で当日分などに絞ると誤検知を避けられます。

  • name は論理名、identifier は実テーブル名(混同しない)
  • 説明・責任者・SLA は docs/meta に記載
  • database/schema は target 変数や profiles.yml で環境差分を吸収
  • クエリ負荷を抑えるため、不要列は下流の stg モデルで選別
設定項目役割注意点
name / tables.namesource()/docs 上の論理名実名と異なるなら identifier を併用
identifier実テーブル名の指定大文字小文字や記号の差異を吸収
freshness新鮮度のしきい値filter で対象期間を絞ると実行負荷低減

YAML での Sources 定義と model からの参照例

# schema.yml(version: 2)
version: 2
sources:
  - name: raw          # 論理名(source() 第1引数)
    database: {{ target.database }}   # 環境ごとに解決
    schema: raw
    description: 原始取り込み領域(外部管理)
    freshness:
      warn_after: {count: 2, period: hour}
      error_after: {count: 6, period: hour}
      filter: "_ingested_at >= dateadd('day', -1, current_timestamp())"
    tables:
      - name: orders_raw      # 論理名(source() 第2引数)
        identifier: ext_orders # 実テーブル名
        loaded_at_field: _ingested_at
        columns:
          - name: order_id
            tests:
              - not_null

-- models/stg_orders.sql
with src as (
  select *
  from {{ source('raw', 'orders_raw') }}
)
select
  cast(order_id as string) as order_id,
  customer_id,
  order_ts,
  _ingested_at
from src;

テストと新鮮度チェック(dbt test / dbt source freshness)

ソース列への not_null や unique などの汎用テストは、通常のモデル列テストと同様に YAML で宣言します。dbt test を実行するとソース列も検証対象となり、異常は早期に検知されます。

新鮮度は dbt source freshness コマンドで評価されます。loaded_at_field を基準に現在時刻との差を測り、warn_after / error_after を超えた場合にステータスが変わります。filter を使い、派生ビューや長期履歴を除外して当日分のみを対象にするなど、実データの性質に合わせてチューニングします。

  • dbt test: 列品質の担保(null 混入などの早期検知)
  • dbt source freshness: 取り込み遅延の監視(SLA 逸脱検出)
  • loaded_at_field は時刻型が推奨、文字列なら適切にキャストできるように
  • スケジューラでの定期実行時は結果をアーティファクトとして保存し可視化(dbt docs に反映)
設定/コマンド機能補足
columns[].testsソース列の品質テストnot_null, unique など
loaded_at_field新鮮度の基準列取り込み時刻を指す列を指定
dbt source freshness新鮮度評価の実行warn_after / error_after を判定

運用パターンとアンチパターン

安定運用の基本は「Sources で外部を明示」「stg レイヤで整形」「上位は ref() で接続」の三層です。環境やアダプタ(Snowflake/Databricks/BigQuery 等)の差異は Sources と profiles.yml 側で解消し、モデルは常に source()/ref() で抽象化します。

避けるべきは、スキーマ直書きや、実テーブル名の変更を前提にした脆い依存です。identifier を使えば命名の差分を吸収でき、下流への影響を最小化できます。

  • 推奨: raw → stg → marts の三層、外部は source()、内部は ref()
  • 推奨: identifier で実名差分吸収、name はビジネス的な論理名に
  • 非推奨: スキーマ直書き、環境固有の DB 名をモデルに埋め込む
  • 非推奨: loaded_at_field 未設定で新鮮度監視を諦める
パターン利点リスク/注意点
source() + stg 整形可観測性と保守性が高い初期定義の手間はあるが長期的に得
直書き参照短期の素早い試行環境移行・監査・変更時に破綻
identifier 併用命名変更の影響を局所化論理名と実名の混同に注意

Analytics Engineer 試験対策の要点

試験では、source() と ref() の使い分け、Sources の YAML 定義(name と identifier の役割、loaded_at_field、freshness)が頻出です。また、環境可搬性やリネージに関する設問で、スキーマ直書きが不正解になるパターンが多い点に注意します。

コード断片の読み取りでは、source() の2引数が YAML の name を参照しているか、freshness の warn_after/error_after の意味、filter の影響範囲などを把握しているかが問われやすいです。

  • 外部データは source()、内部モデルは ref()
  • name と identifier を取り違えない(source() は name を参照)
  • freshness は loaded_at_field を前提に評価される
  • 直書きはリネージに載らず不正解になりやすい
キーワード出題意図押さえどころ
source()外部参照の表現2引数(source名, テーブル名)は YAML の name
freshness新鮮度監視warn_after / error_after / filter / loaded_at_field
identifier実テーブル名の差分吸収論理名と実名の橋渡し

問題で確認

Analytics Engineer

問題 1

BigQuery 上の raw データセットにある billing_transactions を dbt モデルから参照したい。テーブルは dbt で管理していない。正しい参照方法はどれか。

  1. select * from {{ source('raw', 'billing_transactions') }}
  2. select * from {{ ref('billing_transactions') }}
  3. select * from raw.billing_transactions
  4. select * from {{ var('raw_schema') }}.billing_transactions

正解: A

外部テーブルは Sources に定義し、source() で参照するのが正解。これにより環境可搬性・リネージ・テスト・新鮮度が機能する。ref() は dbt 管理のモデル用。スキーマ直書きや変数連結ではリネージや新鮮度の恩恵が得られない。

よくある質問

source() と ref() を同じモデルで混在させてもよいですか?

はい。外部データの取り込み部分は source()、下流の内部依存は ref() でつなぎます。stg モデルで source() を使い、その後の marts/dim/fact では ref() を使うのが一般的です。

新鮮度チェックはビューや外部テーブルでも使えますか?

loaded_at_field が解決でき、アダプタ側で時刻比較が可能なら評価できます。取得コストが高い場合は filter で期間を絞るなど負荷対策を行ってください。

Snowflake や Databricks など異なる DWH でも設定は共通化できますか?

共通化できます。database/schema は profiles.yml や target 変数で切り替え、モデルは常に source()/ref() を用いることで可搬性を確保します。大文字小文字や命名差は identifier と quoting 設定で吸収します。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
dbt

dbt Model の基礎: SQL で定義する変換の最小単位

Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...

dbt

dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点

dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...

dbt

dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点

dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...

dbt

dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト

Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....

dbt

dbt_project.yml の読み方:主要設定と命名を最短で掴む

dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...

dbtの記事一覧 (100件)
© 2026 NicheeLab All rights reserved.