manifest.json は、dbt プロジェクトの“静的メタデータ”をすべて束ねた成果物です。モデルやソース、テスト、マクロ、依存関係が一枚にまとまります。生成は target/manifest.json。dbt compile、run、test、docs generate など、プロジェクトを解析する多くのコマンドで更新されます。
本稿では、公式ドキュメントに沿って変化が少ないキーを中心に読み解きます。日々の運用に役立つチェック方法と、Analytics Engineer 試験で狙われやすい観点を整理します。
manifest.json は、dbt がプロジェクトを静的解析した結果です。各ノード(models、seeds、snapshots、analyses、tests など)や sources、macros、exposures の定義と、それらの依存関係が含まれます。実行結果そのものではなく、実行“前提”のメタです。
生成タイミングは安定しており、dbt がパーサを走らせるコマンドで target/manifest.json が更新されます。CI ではこのファイルを成果物として保存し、差分レビューや系譜の健全性チェックに活用できます。
dbt と manifest.json の関係(静的メタ → 実行)
manifest.json(抜粋・トップレベル)のイメージ
{
"metadata": {
"dbt_version": "1.x.y",
"generated_at": "2026-04-18T10:00:00Z",
"project_id": "..."
},
"nodes": { "model.my_pkg.my_model": { "resource_type": "model", "name": "my_model", "config": { "materialized": "view" } } },
"sources": { "source.my_pkg.my_src.my_tbl": { "source_name": "my_src", "name": "my_tbl" } },
"macros": { "macro.my_pkg.some_macro": { "path": "macros/some.sql" } },
"exposures": { },
"parent_map": { "model.my_pkg.my_model": ["source.my_pkg.my_src.my_tbl"] },
"child_map": { "source.my_pkg.my_src.my_tbl": ["model.my_pkg.my_model"] }
}試験でも問われやすいのがトップレベルの読み分けです。nodes にはモデル・シード・スナップショット・分析・テストなど“構築対象”の多くが入り、sources はデータソース専用、macros は Jinja マクロ、exposures は BI ダッシュボードなどの外部公開物を表します。parent_map / child_map は依存グラフの逆引き・正引きに便利です。
metadata はバージョンや生成時刻などのコンテキストで、アーティファクト間の整合性確認に用います。
| キー | 役割 | 主な利用場面 |
|---|---|---|
| nodes | モデル等の“構築対象”ノード全般 | materialization の集計、列メタの棚卸し、依存確認 |
| sources | 外部ソース定義 | リネージ追跡の起点、ソース健全性チェック |
| macros | Jinja マクロ定義 | プロジェクト横断の再利用把握、影響範囲の見積もり |
| exposures | 外部公開物(BI・API など) | ダッシュボードの上流依存提示、利害関係者への可視化 |
| parent_map | ノード→親ノードの一覧 | 上流の追跡(どこから来たか) |
| child_map | ノード→子ノードの一覧 | 下流の影響(どこへ行くか) |
トップレベルを列挙して存在確認(jq の例)
jq -r 'keys[]' target/manifest.json
# 出力例:
# metadata
# nodes
# sources
# macros
# exposures
# parent_map
# child_mapnodes の各要素はユニークキー(例: model.pkg_name.model_name)で引けます。resource_type は model/seed/snapshot/test/analysis など。多くの実務チェックと試験問題は、config、depends_on、relation_name(コンパイル後の物理名)、original_file_path、fqn、columns、tags、description あたりを理解していれば解けます。
config.materialized は最頻出。view/table/incremental/ephemeral 等の区別は、コストや依存解決に直結します。columns 配下の description や tests の紐づきはドキュメント品質の要。
モデルノードの抜粋(重要フィールド)
{
"nodes": {
"model.jaffle_shop.orders": {
"resource_type": "model",
"name": "orders",
"package_name": "jaffle_shop",
"original_file_path": "models/orders.sql",
"fqn": ["jaffle_shop", "models", "orders"],
"database": "ANALYTICS",
"schema": "DBT_DEV",
"alias": null,
"relation_name": "ANALYTICS.DBT_DEV.ORDERS",
"config": { "materialized": "view", "tags": ["core"] },
"description": "注文ファクトの基礎モデル",
"columns": {
"order_id": {"name": "order_id", "description": "主キー"},
"customer_id": {"name": "customer_id", "description": "外部キー"}
},
"depends_on": { "nodes": ["source.jaffle_shop.raw.orders"] },
"checksum": {"name": "sha256", "checksum": "..."}
}
}
}系譜の基本は depends_on.nodes で上流を把握すること。parent_map と child_map は全体グラフを引き回すのに役立ちます。上流の再帰展開は parent_map を辿り、下流影響の評価は child_map を辿るのが効率的です。
選択子(selection)は公式仕様に準じますが、manifest.json 側で地道に確認すると誤解が減ります。たとえば +model_name 相当の拡張は child_map を再帰に辿ることで再現できます。
上流と下流を列挙する簡易 jq(unique_id を起点)
# 上流(親)
uid="model.jaffle_shop.orders"
jq --arg uid "$uid" -r '.parent_map[$uid][]?' target/manifest.json
# 下流(子)
jq --arg uid "$uid" -r '.child_map[$uid][]?' target/manifest.json
# 直接依存(ノード内)
jq --arg uid "$uid" -r '.nodes[$uid].depends_on.nodes[]?' target/manifest.jsonsources は上流データベースのテーブル・ビューを dbt 側で命名・文書化するための定義です。manifest.json では source.<pkg>.<source_name>.<name> という unique_id で現れ、database/schema/name、loader、description 等が確認できます。
tests は多くが nodes に resource_type: test として格納され、対象ノードやカラムへの参照が depends_on に入ります。exposures はダッシュボードの所有者、url、maturity、depends_on などの静的情報を持ち、利害関係者に伝えやすい形で上流依存を示すのに有用です。
source と test, exposure の抜粋
{
"sources": {
"source.jaffle_shop.raw.orders": {
"source_name": "raw",
"name": "orders",
"database": "RAW",
"schema": "JAFFLE",
"loader": "ingestion_tool",
"description": "生の注文テーブル"
}
},
"nodes": {
"test.jaffle_shop.not_null_orders_order_id": {
"resource_type": "test",
"name": "not_null",
"depends_on": {"nodes": ["model.jaffle_shop.orders"]}
}
},
"exposures": {
"exposure.jaffle_shop.orders_dashboard": {
"type": "dashboard",
"name": "orders_dashboard",
"owner": {"name": "BI Team", "email": "[email protected]"},
"url": "https://bi.example.com/dash/123",
"maturity": "high",
"depends_on": ["model.jaffle_shop.orders"]
}
}
}実務では、manifest.json を定期的に収集し、materialization の逸脱検知、未文書カラムの棚卸し、未使用モデルの洗出し(下流ゼロ)を自動化すると効果的です。CI では manifest の差分を Pull Request に添付するとレビュー効率が上がります。
試験では、manifest.json が“静的メタ”であり、実行結果は run_results.json 側という区別、nodes/sources/macros/exposures の管轄、depends_on と parent_map/child_map の役割、config.materialized の影響を問う設問が定番です。バージョン差異に敏感なフィールドには依存しすぎず、resource_type、depends_on、config、relation_name のような安定キーを軸に覚えるのが安全です。
全モデルの materialized を棚卸し(jq)
jq -r '
.nodes
| to_entries[]
| select(.value.resource_type=="model")
| [.key, (.value.config.materialized // "<unset>")]
| @tsv
' target/manifest.json
# 出力: unique_id と materialized の対応Analytics Engineer
問題 1
Analytics Engineer として、manifest.json を用いて特定モデルの“下流にあるすべてのノード”を列挙したい。最も直接的に参照すべきフィールドの組み合わせはどれか。
正解: A
下流の列挙は child_map[unique_id] を起点に再帰的にたどるのが直接的。depends_on は上流、metadata/macros は下流列挙に適さない。
manifest.json と run_results.json の違いは?
manifest.json は静的メタ(ノード属性・依存)。run_results.json は実行結果(成功/失敗、実行時間、行数など)。用途が異なるため混同しないようにします。
認証情報やデータ値は manifest.json に含まれますか?
いいえ。manifest.json は構造とメタ情報のみで、資格情報やデータ本体は含みません。セキュアに扱いつつも、機密データの直接漏えい対象にはなりにくいアーティファクトです。
バージョン差異への対処は?
metadata.dbt_version を確認し、安定フィールド(resource_type、depends_on、config、relation_name 等)を軸に処理します。スキーマが変わりやすい部分へ依存する場合は、CI でスキーマ検証を追加して早期検知しましょう。
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)、設定優先度...