Databricksでデータパイプラインを構築する際、Lakeflow Declarative Pipelines(旧Delta Live Tables / DLT)とWorkflows(Jobs)のどちらを使うべきか、あるいは併用すべきかは頻出の設計判断です。 DLTは「何をしたいか」を宣言する方式で、データ品質や依存関係をフレームワークが自動管理します。 Workflowsは「どう実行するか」を命令する方式で、任意のタスクをDAGで組み合わせて柔軟にオーケストレーションします。
本記事では両者を実行モデル・エラー処理・データ品質・コストの4軸で比較し、併用パターンと選択判断フローを整理します。
| 観点 | DLT(Declarative Pipelines) | Workflows(Jobs) |
|---|---|---|
| 実行モデル | 宣言型:テーブル間の依存関係をフレームワークが自動解決 | 命令型:タスクの実行順をDAGで明示的に定義 |
| 定義方法 | @dlt.tableデコレータ / SQL CREATE LIVE TABLE | JSON/YAML定義 / UI / Databricks CLI / REST API |
| エラー処理 | Expectations(品質違反の記録/除外/停止)が組み込み | タスク単位のリトライ、条件分岐、通知設定 |
| データ品質 | Expectationsによる宣言的な品質ゲート | 組み込みの品質機能なし(ノートブック内で自前実装) |
| 再処理 | Full Refresh / 増分処理をフレームワークが管理 | 手動でバックフィルロジックを実装 |
| リネージ | テーブル間の依存関係を自動可視化 | タスク間のDAGは可視化されるがデータリネージは別途 |
| 対象ワークロード | ETL/ELTパイプライン(テーブル変換中心) | ETL・ML・通知・外部API呼び出し等あらゆるタスク |
| コスト | DLT用のDBU単価が適用(通常のJobsより高い) | Jobs Compute DBU単価(DLTより低い) |
| コンピュート管理 | DLTがクラスタを自動管理(Enhanced Autoscaling) | ジョブクラスタまたは既存クラスタを指定 |
DLTでは「このテーブルはこのソースからこう変換して作る」と宣言するだけで、依存関係の解決・増分処理・スキーマ進化をフレームワークが管理します。
import dlt
from pyspark.sql.functions import col, current_timestamp
@dlt.table(comment="Bronzeレイヤー:生データ取り込み")
def bronze_orders():
return (
spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "json")
.load("/mnt/landing/orders/")
)
@dlt.table(comment="Silverレイヤー:クレンジング済み")
@dlt.expect_or_drop("valid_amount", "amount > 0")
def silver_orders():
return (
dlt.read_stream("bronze_orders")
.select("order_id", "customer_id", "amount", "region",
current_timestamp().alias("processed_at"))
.filter(col("order_id").isNotNull())
)
@dlt.table(comment="Goldレイヤー:集約")
def gold_revenue_by_region():
return (
dlt.read("silver_orders")
.groupBy("region")
.agg({"amount": "sum"})
.withColumnRenamed("sum(amount)", "total_revenue")
)dlt.read_stream()でストリーミング読み取り、dlt.read()でバッチ読み取りを指定します。 テーブル間の依存はread/read_streamの参照先から自動的に解決されるため、実行順の指定は不要です。
Workflowsはタスクの依存関係をDAG(有向非巡回グラフ)として定義します。 各タスクにはノートブック、Pythonスクリプト、JARファイル、DLTパイプライン、dbtプロジェクトなどを指定でき、 異なるコンピュートリソースを割り当てることも可能です。
# Workflows のDAG構造の概念
#
# [extract_task] ──→ [dlt_pipeline_task] ──→ [notify_task]
# │ ↑
# └──→ [validate_source_task] ──────────────┘
#
# - extract_task: 外部APIからデータ取得(Pythonノートブック)
# - dlt_pipeline_task: DLTパイプラインでETL(タスクタイプ: Pipeline)
# - validate_source_task: ソースデータの疎通確認
# - notify_task: Slack通知(成功/失敗を条件分岐で制御)Workflowsの強みは、タスクごとにリトライ回数・タイムアウト・条件分岐(if/else/for_each)を設定できる柔軟性です。 MLモデルの学習、外部APIの呼び出し、通知といったデータ変換以外のタスクも統合管理できます。
実務で最も多いのは、WorkflowsのDAG内の1タスクとしてDLTパイプラインを組み込む併用パターンです。 DLTにはETLの変換・品質管理を任せ、Workflowsには前後処理のオーケストレーションを担当させます。
| タスク順序 | 担当 | 内容 |
|---|---|---|
| 1. データ取得 | Workflows タスク(ノートブック) | 外部APIからJSON取得→Landingゾーンに保存 |
| 2. ETL変換 | Workflows タスク(DLTパイプライン) | Bronze→Silver→GoldをDLTで宣言的に処理 |
| 3. データ検証 | Workflows タスク(ノートブック) | Goldテーブルのレコード数やチェックサム検証 |
| 4. 通知 | Workflows タスク(条件分岐) | 成功→Slack通知、失敗→PagerDutyアラート |
この構成では、DLTパイプラインの成功/失敗がWorkflowsのタスクステータスとして伝搬するため、 後続タスクの条件分岐やリトライ設定と組み合わせた高度なエラーハンドリングが可能です。
DLTとWorkflowsの選択は、パイプラインの性質とチームのニーズに応じて判断します。
パイプラインの中心はテーブル変換(ETL/ELT)か?
├─ YES → データ品質管理(Expectations)が必要か?
│ ├─ YES → DLTを使う(Workflowsと併用も検討)
│ └─ NO → シンプルならWorkflows単体、複雑ならDLTを検討
└─ NO → MLトレーニング・外部API・通知など多様なタスクか?
└─ YES → Workflowsを使う(ETL部分があればDLTを併用)DLTはDLT専用のDBU単価が適用され、通常のJobs Compute DBUより単価が高くなります。 ただしDLTはEnhanced Autoscalingによるクラスタ最適化やincremental処理の自動化を行うため、 手動で同等の機能を実装した場合の開発コスト・運用コストとの総合比較が必要です。
| コスト項目 | DLT | Workflows(ノートブック直接実行) |
|---|---|---|
| DBU単価 | DLT単価(Jobs Computeより高い) | Jobs Compute単価 |
| クラスタ管理 | 自動(Enhanced Autoscaling) | 手動設定(オーバー/アンダープロビジョニングのリスク) |
| 品質管理の開発コスト | Expectations組み込み(追加開発なし) | 自前実装が必要(開発・テスト・保守コスト) |
| 増分処理の開発コスト | フレームワーク自動管理 | Structured Streamingやmergeロジックを自前実装 |
Data Engineer Associate / Professional
問題 1
データエンジニアが以下の要件を持つパイプラインを設計している。(1) 外部APIからデータ取得 (2) Bronze→Silver→Goldの3段階ETL (3) Silverテーブルで品質違反レコードを自動除外 (4) パイプライン完了後にSlack通知。最も適切なアーキテクチャはどれか。
正解: C
外部APIからのデータ取得やSlack通知はDLTの対象外(テーブル変換ではない)であるため、DLT単独では要件を満たせません。WorkflowsでDAGを構成し、ETL部分をDLTパイプラインタスクとして組み込むことで、DLTのExpectationsによる品質管理とWorkflowsの柔軟なタスクオーケストレーション(通知含む)を併用できます。
DLTパイプラインをWorkflowsのタスクとして実行できますか?
はい、Workflowsのタスクタイプに「Delta Live Tables pipeline」があり、DLTパイプラインをDAGの一タスクとして組み込めます。前段でデータ取得、中段でDLT変換、後段で通知といった構成が可能です。DLTの宣言型品質管理とWorkflowsのオーケストレーションを組み合わせた最も一般的な併用パターンです。
DLTとWorkflowsでエラーハンドリングはどう違いますか?
DLTはパイプライン内でExpectations(品質制約)に基づく自動的なエラー処理(記録/除外/停止)を行います。Workflowsはタスク単位でリトライ回数・条件分岐(if/else task)・通知を設定でき、より広範なオーケストレーション制御が可能です。両者を併用すると、DLTでデータ品質エラーを処理し、Workflowsでインフラ障害やタスク失敗をハンドリングする二層の構造になります。
小規模チームでもDLTを導入すべきですか?
ETLパイプラインが3テーブル以上の依存関係を持ち、品質管理やリネージ可視化が必要なら、小規模でもDLTの導入効果があります。逆に、単純なnotebook1本のバッチ処理であればWorkflows単体で十分です。DLTの管理テーブルやイベントログの運用コストも考慮して判断してください。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Databricks資格一覧|全7試験・難易度・勉強法
Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...
Databricks試験の難易度ランキング|全7資格を徹底比較
Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...
Databricks資格の勉強方法|最短合格ルートと学習時間の目安
Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...
Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略
Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...
Databricks Data Engineer Professional完全解説|上級試験の攻略法
Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...