PythonモジュールとRモジュールを操作する
この記事では、相対パスを使用して、Databricks ノートブックと共にワークスペース ファイルに格納されているカスタム Python モジュールと R モジュールをインポートする方法について説明します。 ワークスペース ファイルを使用すると、開発ライフサイクルの緊密化が促進され、コードのモジュール化、%run コマンドのインポート ステートメントへの変換、Python wheel ファイルを共同バージョン管理されたモジュールへのリファクタリングが可能になります。組み込み Databricks Webターミナルを使用してコードをテストすることもできます。
Databricks Runtime 14.0 以降では、ローカルで実行されるコードのデフォルト カレント ワーキング ディレクトリ (CWD) は、実行されているノートブックまたはスクリプトを含むディレクトリです。これは、Databricks Runtime 13.3 LTS 以下からの動作の変更です。 「デフォルトの現在の作業ディレクトリとは」を参照してください。
PythonモジュールとRモジュールのインポート
Databricks Runtime 13.3 LTS 以降では、Python sys.path
に追加されたディレクトリ、またはPythonパッケージとして構造化されたディレクトリは、クラスタリング内のすべてのエグゼキューターに自動的に配布されます。Databricks Runtime 12.2 LTS以下では、sys.path
に追加されたライブラリをエグゼキューターに明示的にインストールする必要があります。
Databricks Runtime 11.3 LTS 以降では、ノートブックの現在の作業ディレクトリが Python パスに自動的に追加されます。 Git フォルダーを使用している場合は、ルート リポジトリ ディレクトリが追加されます。
別のディレクトリからモジュールをインポートするには、モジュールを含むディレクトリを sys.path
に追加する必要があります。 ディレクトリは、次の例のように相対パスを使用して指定できます。
import sys
import os
sys.path.append(os.path.abspath('..'))
ワークスペース ファイルに格納されたモジュールから関数をインポートするには、クラスタリング ライブラリまたはノートブック スコープのライブラリとして保存されたモジュールからインポートするのと同じです。
- Python
- R
from sample import power
power.powerOfTwo(3)
source("sample.R")
power.powerOfTwo(3)
import
ステートメントを使用し、同じ名前のライブラリが複数存在する場合、 Databricks は優先順位ルールを使用してロードするライブラリを決定します。 Python ライブラリの優先順位を参照してください。
Pythonモジュールの自動再読み込み
Python コードの開発中に複数のファイルを編集している場合は、 autoreload
拡張機能を有効にして、インポートされたモジュールを自動的に再読み込みし、コマンド実行でそれらの編集が取得されるようにすることができます。 ノートブックのセルまたは Python ファイルで次のコマンドを使用して、 autoreload
拡張機能を有効にします。
%load_ext autoreload
%autoreload 2
autoreload
拡張機能は Spark ドライバー プロセスでのみ機能し、コードを Spark エグゼキューター プロセスに再読み込みしません。これは Spark ドライバーノードでのみ機能し、Spark エグゼキューターを実行しているノードでは機能しないため、ワーカーノードで実行されるモジュール (UDF など) を開発する場合は autoreload
を使用しないでください。
Databricks Runtime 16.0 以降では、Databricks の autoreload
拡張機能に次の機能が追加されています。
- 関数内部の変更のためのモジュールのターゲットを絞ったリロードのサポート。 可能な限りモジュールの変更された部分だけをリロードすることで、各オブジェクトの外部から見えるインスタンスが 1 つだけになり、より安全で信頼性が向上します。
- ワークスペース ファイルから Python モジュールをインポートすると、モジュールが前回のインポート以降に変更された場合、Databricks は
autoreload
の使用を自動的に提案します。
autoreload
拡張機能の詳細については、IPython の自動再読み込みに関するドキュメントを参照してください。
コードのリファクタリング
コード開発のベスト プラクティスは、コードをモジュール化して簡単に再利用できるようにすることです。 ワークスペース ファイルを使用してカスタム Python ファイルを作成し、 import
ステートメントを使用して、それらのファイル内のコードをノートブックで使用できるようにすることができます。
ノートブックのコードを再利用可能なファイルにリファクタリングするには:
- コードの新しいソース コード ファイルを作成します。
- Python インポート ステートメントをノートブックに追加して、新しいファイル内のコードをノートブックで使用できるようにします。
%run
コマンドからの移行
%run
コマンドを使用して、ノートブックで定義された Python 関数または R 関数を別のノートブックで使用できるようにする場合、またはカスタム .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)
その後、 power.py
で定義された関数を別のノートブックで使用できるようにするには、 %run
コマンドを使用します。
# 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プロジェクトのパッケージ化の詳細については、このチュートリアル を参照してください。
Databricks Webターミナルを使用してテストする
Databricks Webターミナルを使用すると、ノートブックを使用してファイルをインポートおよび実行することなく、PythonまたはRコードへの変更をテストできます。
- Webターミナルを開きます。
- ディレクトリ (
cd /Workspace/Users/<path-to-directory>/
. - PythonまたはRファイルを実行します:
python file_name.py
またはRscript file_name.r
。