dbt Databricks アダプターは、Delta Lake の ACID/タイムトラベル/MERGE を活かして、データモデリングから本番運用までを単一の開発体験で支えます。本稿は公式ドキュメントの挙動を前提に、試験でも問われやすい安定概念に絞って整理します。
バージョン依存の細部は言及を控え、接続設定、マテリアライゼーション、インクリメンタル戦略、Unity Catalog 権限、運用最適化の順で、受験と現場の双方で迷わない基準を提示します。
dbt-databricks は Databricks SQL Warehouse/クラスターに対して SQL を発行し、Delta Lake テーブルに対して view/table/incremental のマテリアライゼーションを実現します。Delta Lake の ACID トランザクションと MERGE が、信頼できるアップサートの土台です。
Analytics Engineer の観点では、インクリメンタル戦略、Unity Catalog の 3 階層名、プロファイル設定(host/http_path/token)の整合が頻出ポイントです。
dbt から Delta Lake への実行フロー(概念)
インストールの最小例(ローカル開発)
python -m venv .venv
source .venv/bin/activate # Windows は .venv\\Scripts\\activate
pip install --upgrade pip
pip install dbt-databricksDatabricks への接続は profiles.yml に host, http_path, token を定義します。SQL Warehouse を使うと安定した ANSI SQL 実行と自動スケーリングが得られます。Unity Catalog を使う場合は catalog を明示しましょう。legacy の Hive Metastore を使う場合は catalog を hive_metastore にします。
試験・実務ともに http_path の値が SQL Warehouse 用とクラスター用で異なる点、そして catalog と schema の使い分けが落とし穴です。
profiles.yml の例(SQL Warehouse とクラスター)
databricks_profile:
target: dev
outputs:
dev:
type: databricks
method: http
host: https://<your-workspace-host>
http_path: /sql/1.0/warehouses/<warehouse-id>
token: <databricks-personal-access-token>
catalog: main # Unity Catalog を利用しないなら hive_metastore
schema: analytics_dev # ユーザーごとの開発スキーマを推奨
threads: 4
cluster_dev:
type: databricks
method: http
host: https://<your-workspace-host>
http_path: /sql/protocolv1/o/<org-id>/<cluster-id> # 全用途クラスター
token: <databricks-personal-access-token>
catalog: hive_metastore
schema: analytics_dev
threads: 4Databricks アダプターは table/view/incremental/seed/snapshot をサポートします。Delta Lake を明示したい場合は file_format=delta を指定します。デフォルトが Delta である環境もありますが、試験・保守性の観点から明示を推奨します。
テーブルプロパティで自動最適化や圧縮を有効化できます。プロパティ名はワークスペース設定に依存するため、安定性重視なら post-hook で OPTIMIZE を呼ぶ方が安全です。
Delta テーブルの基本モデル例
{{ config(
materialized='table',
file_format='delta',
tags=['core'],
grants={'select': ['analyst_group']}
) }}
with src as (
select * from {{ source('app', 'orders_raw') }}
)
select
order_id,
customer_id,
cast(order_ts as timestamp) as order_ts,
amount
from srcインクリメンタルは大量データでの再計算コストを抑制します。Databricks アダプターでは、unique_key を指定すると MERGE が選ばれ、アップサートが可能になります。unique_key がない場合は append が無難です。パーティションを張る場合は insert_overwrite を検討します。
CDC の到着遅延や再取り込みに備え、is_incremental 条件で WHERE 句を分けるのが定石です。水位は更新タイムスタンプや増分 ID を用いると安定します。
| 戦略 | 更新・削除対応 | 必須/前提 | 典型ユースケース |
|---|---|---|---|
| append | 更新・削除は不可(追記のみ) | なし(キー不要) | イベントログ、監査証跡 |
| merge | 更新に対応(アップサート)。削除は別途設計 | unique_key の指定が望ましい | ディメンション/ファクトの漸増更新 |
| insert_overwrite | 対象パーティションを置換 | partition_by の定義 | 日次/時間分割の再作成最適化 |
MERGE を使うインクリメンタルモデル(到着遅延に対応)
{{ config(
materialized='incremental',
file_format='delta',
unique_key='order_id',
incremental_strategy='merge',
on_schema_change='append_new_columns' # 追加カラムは自動追加(安定挙動)
) }}
with staged as (
select
order_id,
customer_id,
cast(order_ts as timestamp) as order_ts,
amount,
ingestion_ts
from {{ ref('stg_orders') }}
{% if is_incremental() %}
where order_ts >= date_sub(current_timestamp(), 7) -- 到着遅延のバッファ
{% endif %}
)
select * from stagedUnity Catalog では catalog.schema.table の 3 階層でオブジェクトを管理します。dbt の database は Databricks では catalog に相当します。開発・本番で catalog/schema を明確に分け、ターゲット切替で衝突を防ぎます。
権限は dbt の grants 設定から付与できます。CREATE SCHEMA は pre-hook、統計最適化などは post-hook で呼ぶパターンが安全です。
権限とスキーマ作成のフック例
{{ config(
materialized='table',
file_format='delta',
grants={'select': ['analyst_group'], 'usage': ['bi_group']},
pre_hook=["create schema if not exists {{ target.catalog }}.{{ target.schema }}"],
post_hook=["analyze table {{ this }} compute statistics"]
) }}
select 1 as okDelta Lake の性能維持にはファイルサイズの最適化と統計の更新が重要です。大規模テーブルは OPTIMIZE、アクセスパターンが明確なら ZORDER を post-hook で実行します。VACUUM は保持期間とガバナンスルールに合わせて慎重に運用します。
ジョブ設計では run-operation でメタ操作を分離し、並列度はメタストア負荷と相談して段階的に上げます。テストは not_null/unique/relationships を最優先に据え、障害時の切り戻しには Delta のタイムトラベルを活用できます。
OPTIMIZE/ZORDER の post-hook 例(慎重に適用)
{{ config(
materialized='incremental',
file_format='delta',
unique_key='id',
incremental_strategy='merge',
post_hook=[
"optimize {{ this }} zorder by (customer_id, order_ts)",
"analyze table {{ this }} compute statistics"
]
) }}
select * from {{ ref('stg_fact') }}Analytics Engineer
問題 1
Databricks 上の Delta テーブルに対し、dbt でアップサート可能なインクリメンタルモデルを構成したい。実装と運用コストを最小にしつつ、同一レコードの更新を正しく反映するための設定として最も適切なのはどれか。
正解: A
Delta Lake の MERGE を活用するには dbt 側で unique_key を指定し、incremental_strategy=merge を使うのが定石。到着遅延への対処として is_incremental で再抽出範囲を絞る実装は実務でも有効。他の選択肢は更新の完全性やコスト面で不利。
Delta のタイムトラベルは dbt からどう活用する?
SELECT ... VERSION AS OF や TIMESTAMP AS OF を用いる SQL をモデル内で直接記述できます。ロールバックには DDL を使うため dbt モデル外の運用手順として切り出し、dbt 側は参照や検証に限定するのが安全です。
Unity Catalog の 3 階層は dbt でどう指定する?
profiles.yml の catalog が Unity Catalog のカタログ、schema はスキーマ、モデル名(identifier)がテーブル名になります。this で展開されるのは catalog.schema.identifier の順序です。
スキーマ進化にどう備える?
incremental モデルで on_schema_change='append_new_columns' を設定すると、新規カラムが追加された際にテーブルへ追加できます。大きな型変更は別マイグレーションに分離し、テストを併走させるのが無難です。
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)、設定優先度...