Python と R のモジュールを使用する

この記事では、Databricks ノートブックと共にワークスペース ファイルに格納されている Python や R のカスタム モジュールを、相対パスを使用してインポートする方法について説明します。 ワークスペース ファイルを使用すると、開発ライフサイクルをより厳密に管理しやすくなり、コードのモジュール化%run コマンドの import ステートメントへの変換Python ホイール ファイルの、共同でバージョン管理されたモジュールへのリファクターを行えるようになります。 組み込みの Databricks Web ターミナルを使用してコードをテストすることもできます。

Note

Databricks Runtime 14.0 以降では、ローカルで実行されるコードの既定の現在の作業ディレクトリ (CWD) は、実行されているノートブックまたはスクリプトを含むディレクトリです。 これは、Databricks Runtime 13.3 LTS 以降の動作の変更です。 「既定の現在の作業ディレクトリとは?」を参照してください。

Python と R のモジュールをインポートする

重要

Databricks Runtime 13.3 LTS 以上では、Python の sys.path に追加されたディレクトリ、または Python パッケージとして構成されたディレクトリは、クラスター内のすべての Executor に自動的に配布されます。 Databricks Runtime 12.2 LTS 以前では、sys.path に追加されたライブラリを Executor に明示的にインストールする必要があります。

Databricks Runtime 11.3 LTS 以上では、ノートブックの現在の作業ディレクトリが Python パスに自動的に追加されます。 Git フォルダーを使用している場合は、ルート リポジトリ ディレクトリが追加されます。

別のディレクトリからモジュールをインポートするには、モジュールを含むディレクトリを sys.path に追加する必要があります。 次の例のように、相対パスを使用してディレクトリを指定できます。

import sys
import os
sys.path.append(os.path.abspath('..'))

クラスター ライブラリまたはノートブック スコープのライブラリとして保存されているモジュールからの場合と同様に、ワークスペース ファイルに保存されているモジュールから関数をインポートします。

Python

from sample import power
power.powerOfTwo(3)

R

source("sample.R")
power.powerOfTwo(3)

重要

ステートメントを import 使用し、同じ名前の複数のライブラリが存在する場合、Databricks は優先順位規則を使用して、読み込むライブラリを決定します。 「Python ライブラリの優先順位」を参照してください。

Python モジュールの自動再読み込み

Python コードの開発中に複数のファイルを編集する場合は、拡張機能で autoreload インポートされたモジュールを自動的に再読み込みできるようにして、コマンドの実行でそれらの編集を取得できます。 任意のノートブック セルまたは Python ファイルで次のコマンドを使用して、拡張機能を autoreload 有効にします。

%load_ext autoreload
%autoreload 2

拡張機能は autoreload Spark ドライバー プロセスでのみ機能し、コードを Spark Executor プロセスに再読み込みしません。 Spark ドライバー ノードでのみ機能し、Spark Executor を実行しているノードでは機能しないため、ワーカー ノード (UDF など) で実行されるモジュールを開発するときは使用 autoreload しないでください。

Databricks Runtime 16.0 以降では、 autoreload Databricks の拡張機能によって次の機能が追加されます。

  • 関数内部の変更に対するモジュールのターゲット 再読み込みのサポート。 モジュールの変更された部分だけを可能な限り再読み込みすることで、各オブジェクトの外部から見えるインスタンスが 1 つだけ存在することが保証され、より安全で信頼性が高くなります。
  • ワークスペース ファイルから Python モジュールをインポートすると、Databricks は、モジュールが前回のインポート以降に変更されたかどうかを自動的に提案 autoreload します。

拡張機能の autoreload 詳細については、IPython の自動読み込みのドキュメントを 参照してください

コードのリファクタリング

コード開発のベスト プラクティスは、コードをモジュール化して簡単に再利用できるようにすることです。 ワークスペース ファイルを使用してリポジトリにカスタム Python ファイルを作成し、import ステートメントを使用して、それらのファイル内のコードをノートブックで使用可能にできます。

ノートブックのコードを再利用可能なファイルにリファクタリングするには:

  1. コードの新しいソース コード ファイルを作成します。
  2. Python の import ステートメントをノートブックに追加し、新しいファイルのコードをノートブックで使用できるようにします。

%run コマンドから移行する

ノートブックで定義されている Python または R の関数を、%run コマンドを使用して別のノートブックで使用できるようにする場合、またはクラスターにカスタム .whl ファイルをインストールする場合は、それらのカスタム モジュールをワークスペースファイルとして含めることを検討してください。 これにより、ノートブックとその他のコード モジュールを同期したままにして、ノートブックで常に正しいバージョンが使用されるようにすることができます。

%run コマンドを使用すると、1 つのノートブックを別のノートブックに含めることができます。これは、多くの場合、サポート Python または R コードをノートブックで使用できるようにするために使用されます。 この例では、power.py という名前のノートブックに以下のコードが含まれています。

# This code is in a notebook named "power.py".
def n_to_mth(n,m):
  print(n, "to the", m, "th power is", n**m)

このようにすると、%run コマンドを使用して、power.py で定義されている関数を別のノートブックで使用できるようにすることができます。

# This notebook uses a %run command to access the code in "power.py".
%run ./power
n_to_mth(3, 4)

ワークスペース ファイルを使用すると、Python コードを含んだモジュールを直接インポートして関数を実行できます。

from power import n_to_mth
n_to_mth(3, 4)

Python の .whl ファイルを相対ライブラリにリファクターする

クラスターにカスタム .whl ファイルをインストールしてから、そのクラスターにアタッチされているノートブックにそれらをインポートすることができます。 ただし、このプロセスは煩雑で、頻繁に更新されるコードではエラーが発生しやすい場合があります。 ワークスペース ファイルを使用すると、コードを使用するノートブックと同じディレクトリにこれらの Python ファイルを保持し、ノートブックで常に正しいバージョンが使用されるようにすることができます。

Python プロジェクトのパッケージ化の詳細については、こちらのチュートリアルを参照してください。

テストに Azure Databricks Web ターミナルを使用する

Azure Databricks Web ターミナルを使用すると、ノートブックを使用してファイルをインポートして実行することなく、Python または R コードの変更をテストできます。

  1. Web ターミナルを開きます。
  2. ディレクトリに移動します: cd /Workspace/Users/<path-to-directory>/
  3. Python または R のファイルを実行します: python file_name.py または Rscript file_name.r