Databricks

Databricks Notebooks: 共同編集・実行モデル・ベストプラクティス

2026-03-21
更新: 2026-03-27
NicheeLab編集部

Databricksノートブックは、Python・SQL・Scala・Rの4言語に対応したインタラクティブな開発環境です。 1つのノートブック内でマジックコマンドを使い複数言語を切り替えられ、リアルタイム共同編集にも対応します。

本記事では、マジックコマンドの全種類、共同編集と権限モデル、実行コンテキスト(インタラクティブ/ジョブ)、 ウィジェットによるパラメータ化、ノートブック間連携、Git統合(Repos)を体系的に整理します。

多言語対応とデフォルト言語

ノートブック作成時にデフォルト言語(Python / SQL / Scala / R)を1つ選択します。 各セルはデフォルト言語で実行されますが、セル先頭にマジックコマンド(%python, %sql等)を記述することで セル単位で言語を切り替えられます。

%python
# Pythonセル:DataFrameを作成してTempViewに登録
df = spark.range(100).toDF("id")
df.createOrReplaceTempView("numbers")

%sql
-- SQLセル:Pythonで作ったTempViewをSQLで参照
SELECT id, id * 10 AS multiplied FROM numbers WHERE id < 10;

%scala
// Scalaセル:同じSparkSessionを共有
val df = spark.sql("SELECT * FROM numbers LIMIT 5")
df.show()

言語を切り替えてもSparkSessionは共有されるため、Pythonで作成したTempViewをSQLやScalaから参照できます。 ただしPython変数とScala変数は直接共有できないため、TempViewやDeltaテーブルを介してデータを受け渡します。

マジックコマンド一覧

コマンド用途実行先代表的な使い方
%pythonPythonセルとして実行アタッチされたクラスタ(ドライバ)DataFrame操作、pandas、ライブラリ呼び出し
%sqlSQLセルとして実行アタッチされたクラスタ(Spark SQL)SELECT / DDL / DML、結果は自動表示
%scalaScalaセルとして実行アタッチされたクラスタ(JVM)型安全なSpark処理、Java連携
%rRセルとして実行アタッチされたクラスタ(SparkR)統計分析、R可視化
%mdMarkdownとしてレンダリングクライアント側(実行なし)ドキュメント、セクション見出し、説明文
%run別ノートブックを同一セッションに読み込みアタッチされたクラスタ共通設定やユーティリティ関数の読み込み
%shシェルコマンドを実行ドライバノードのOSファイル確認、パッケージ情報、curl
%fsDBFSファイルシステム操作DBFS(dbutils.fsのショートカット)ls, cp, head, mkdirs
%pipPythonパッケージのインストールクラスタのPython環境pip install パッケージ名==バージョン

%shはドライバノードのOSで実行されるため、ワーカーノードでは実行されません。 また%shの実行結果はSpark処理に直接渡せないため、ファイルの確認やデバッグ目的で使います。

共同編集とアクセス権限

Databricksノートブックはリアルタイム共同編集に対応しています。複数ユーザーが同時にセルを編集でき、 変更は即座に他のユーザーに反映されます。コメント機能や@メンションでレビューコミュニケーションも可能です。

ノートブックとフォルダには以下の4段階のアクセス権限があります。

権限レベル閲覧実行編集権限管理用途
CAN VIEW不可不可不可レビュアー、閲覧のみの関係者
CAN RUN不可不可分析ユーザー、ジョブ実行者
CAN EDIT不可開発者、コード変更担当
CAN MANAGE管理者、プロジェクトオーナー
  • ジョブ用ノートブックにはCAN RUNのみ付与し、誤編集を防止
  • 秘匿情報はdbutils.secrets.get()で取得。ノートブック内にパスワードやトークンを直接記述しない
  • 大規模な変更はReposでブランチを作成し、PRでレビュー後にマージ

実行コンテキスト:インタラクティブ vs ジョブ

ノートブックの実行には2つのモードがあり、用途に応じて使い分けます。

実行モードコンピュートリソースセッション状態適した用途
インタラクティブ実行All-Purpose Cluster(共有可能)セル間で変数・キャッシュが保持される探索・開発・デバッグ・アドホック分析
ジョブ実行Job Cluster(ジョブ専用、起動→破棄)毎回クリーンな状態から開始定期バッチ、本番ETL、再現性が必要な処理
# インタラクティブ実行のイメージ
# ノートブック → All-Purpose Cluster にアタッチ → セル単位で対話的に実行
#
# ジョブ実行のイメージ
# Workflows → Job Cluster を起動 → ノートブック全体を上から順に実行 → クラスタ破棄
#
# ┌─────────────┐    attach    ┌──────────────────┐
# │  Notebook    │───────────→│ All-Purpose Cluster│  (インタラクティブ)
# │ (開発・探索) │            │ (共有・状態保持)    │
# └─────────────┘            └──────────────────┘
#
# ┌─────────────┐    task     ┌──────────────────┐
# │  Workflow   │───────────→│  Job Cluster      │  (ジョブ)
# │ (定期実行)  │  create    │ (専用・毎回新規)   │
# └─────────────┘            └──────────────────┘

インタラクティブ実行では前のセルの実行結果(変数値、一時ビューなど)が後続セルに引き継がれます。 ジョブ実行では毎回クリーンな環境のため、外部状態に依存しない設計(冪等な書き込み、パラメータ受け渡し)が重要です。

ウィジェット(dbutils.widgets)によるパラメータ化

同一ノートブックを日付・環境・フィルタ条件ごとに使い回すには、ウィジェットでパラメータ化します。 Workflowsのタスクパラメータ(Base parameters)とも連携し、ジョブ実行時に値を注入できます。

%python
# ウィジェットの作成(4種類)
dbutils.widgets.text("proc_date", "2026-01-01", "処理日")
dbutils.widgets.dropdown("env", "dev", ["dev", "staging", "prod"], "環境")
dbutils.widgets.combobox("region", "APAC", ["APAC", "EMEA", "NA"], "リージョン")
dbutils.widgets.multiselect("status", "active", ["active", "inactive", "pending"], "ステータス")

# ウィジェット値の取得
proc_date = dbutils.widgets.get("proc_date")
env = dbutils.widgets.get("env")

# 取得した値をクエリに使用
df = spark.sql(f"""
    SELECT * FROM {env}_catalog.orders.daily
    WHERE order_date = '{proc_date}'
""")
df.display()

# ノートブック終了時に結果を返す(親ジョブが受け取れる)
dbutils.notebook.exit(f"OK: {proc_date}, rows={df.count()}")

ウィジェットの種類はtext(自由入力)、dropdown(単一選択)、combobox(選択+自由入力)、multiselect(複数選択)の4つです。 Workflowsからジョブ実行する場合、Base parametersのキー名がウィジェット名と一致すれば自動的に値が注入されます。

%runとdbutils.notebook.run:ノートブック間連携

ノートブックから別のノートブックを呼び出す方法は2つあり、状態共有の有無が決定的に異なります。

呼び出し方法実行コンテキスト変数共有戻り値推奨用途
%run ./path/to/notebook同一セッション(インライン読み込み)すべて共有(変数、関数、UDF)なし(セッション変数を直接参照)共通設定の読み込み、開発時のデバッグ
dbutils.notebook.run()分離されたセッションなし(完全分離)文字列(dbutils.notebook.exitで返す)本番ジョブ、子タスクの分離実行
%python
# 方法1: %run - 同一セッションに読み込み(状態共有)
# %run ./includes/common_setup
# → common_setup内の変数・関数がすべて使える
# → 状態が混ざるため本番では注意

# 方法2: dbutils.notebook.run - 分離実行(本番推奨)
result = dbutils.notebook.run(
    "./jobs/etl_daily",
    timeout_seconds=3600,
    arguments={"proc_date": "2026-03-27", "env": "prod"}
)
print(f"子ノートブックの結果: {result}")
# → 例: "OK: 2026-03-27, rows=15234"

# 複数ノートブックの並列実行(ThreadPoolExecutorと組み合わせ)
from concurrent.futures import ThreadPoolExecutor

notebooks = ["./jobs/etl_orders", "./jobs/etl_customers", "./jobs/etl_products"]
with ThreadPoolExecutor(max_workers=3) as executor:
    futures = [
        executor.submit(dbutils.notebook.run, nb, 3600, {"proc_date": "2026-03-27"})
        for nb in notebooks
    ]
    results = [f.result() for f in futures]

Git統合(Repos):ノートブックをコードとして管理

Databricks ReposはGitプロバイダ(GitHub、GitLab、Bitbucket、Azure DevOps)と連携し、 ノートブックやPythonモジュールをブランチ単位で管理できます。

  • ブランチ運用:feature → PR → main。PRでコードレビューと承認を実施
  • ノートブックはSource形式(.py)で保存すると、差分レビューが容易
  • Repos配下の.pyファイルをimport可能。共通ロジックをパッケージ化してノートブックは薄く保つ
  • WorkflowsのGit Source機能で特定のブランチ/タグ/コミットを参照して本番の再現性を担保
%python
# Repos配下のPythonモジュールをインポート
# /Repos/[email protected]/my-project/mypkg/transform.py
from mypkg.transform import run_etl, validate_output

# ノートブックはオーケストレーションに集中
result_df = run_etl(spark, source="s3://landing/orders/", date="2026-03-27")
validation = validate_output(result_df, expected_min_rows=1000)

if not validation["passed"]:
    dbutils.notebook.exit(f"VALIDATION_FAILED: {validation['reason']}")

result_df.write.format("delta").mode("overwrite").saveAsTable("gold.daily_orders")

再現性の確保:環境・依存関係・状態管理

  • Databricks Runtimeバージョンを固定(LTS推奨)。ジョブ定義で明示
  • 依存パッケージは%pip install パッケージ==バージョンでピン留め
  • セッション状態(一時ビュー、キャッシュ)に依存しない設計。入力→変換→出力の純粋な流れ
  • Delta Lakeの冪等書き込み(MERGE / overwrite with replaceWhere)で同じ入力から同じ結果を保証
  • 乱数を使う場合はシード値を固定(random.seed / np.random.seed)

試験で問われるポイント

  • %runは同一セッション(状態共有)、dbutils.notebook.runは分離実行(戻り値は文字列)
  • マジックコマンドの%sqlはアタッチされたクラスタで実行(SQLウェアハウスではない)
  • 権限レベル4段階(CAN VIEW / CAN RUN / CAN EDIT / CAN MANAGE)の違い
  • ウィジェットとWorkflowsのBase parametersの連携
  • %shはドライバノードのみで実行される(ワーカーノードでは動かない)

問題で確認

Data Engineer Associate

問題 1

ノートブックAからノートブックBを呼び出し、Bの処理結果(成功/失敗のステータス文字列)をAで判定して後続処理を分岐させたい。AとBの変数空間は分離する必要がある。最も適切な方法はどれか。

  1. %run ./B でBを読み込み、B内で定義したグローバル変数result_statusをAから参照する
  2. dbutils.notebook.run('./B', timeout_seconds=3600) でBを実行し、B側でdbutils.notebook.exit('OK')を呼んで戻り値をAで受け取る
  3. AとBを別フォルダに配置すれば変数空間は自動的に分離される
  4. %sql マジックコマンドでBのノートブックを実行する

正解: B

dbutils.notebook.runは分離された実行コンテキストでノートブックを実行し、dbutils.notebook.exitで返した文字列を戻り値として受け取れます。%runは同一セッションに読み込むため変数空間が共有されます。フォルダ配置や%sqlマジックではノートブック間の呼び出しと状態分離は実現できません。

よくある質問

%runとdbutils.notebook.runの違いは何ですか?

%runは呼び出し先のノートブックを同一セッションに読み込み、変数・関数・UDFがすべて共有されます。dbutils.notebook.runは分離された実行コンテキストで実行し、戻り値はdbutils.notebook.exitで返す文字列のみです。本番ジョブでは状態分離のためdbutils.notebook.runが推奨されます。

ノートブックの%sqlはSQLウェアハウスで動きますか?

通常のノートブック内の%sqlは、アタッチされたSparkクラスター上で実行されます。SQLウェアハウスはDatabricks SQL(SQLエディタ・ダッシュボード)の実行基盤です。ノートブックからSQLウェアハウスに接続するにはspark.sql()ではなくJDBC/ODBC接続やDatabricks SQL Connectorを使用します。

ノートブック内のパッケージ管理はどうすべきですか?

本番ジョブではDatabricks Runtimeバージョンを固定し、%pip install パッケージ名==バージョン でバージョンをピン留めします。Repos配下にrequirements.txtを置き、ノートブック先頭で%pip install -r requirements.txtを実行する方法も一般的です。クラスタライブラリとしてインストールする方法もありますが、ジョブ間の依存競合に注意が必要です。

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

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

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

NicheeLab編集部

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


関連記事
Databricks

Databricks資格一覧|全7試験・難易度・勉強法

Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...

Databricks

Databricks試験の難易度ランキング|全7資格を徹底比較

Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...

Databricks

Databricks資格の勉強方法|最短合格ルートと学習時間の目安

Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...

Databricks

Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略

Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...

Databricks

Databricks Data Engineer Professional完全解説|上級試験の攻略法

Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...

Databricksの記事一覧 (105件)
© 2026 NicheeLab All rights reserved.