Databricksで python モジュールをimportするには？


# はじめに

Databricksを使っていく上で、最初の方でぶつかるのがpythonモジュールのimportではないでしょうか？すでにpublishされているライブラリー等であれば、pipなど使って installできますが、カスタムモジュールを導入するにはどんな方法があるのでしょうか？今回、様々な方法を探ってみました。

# カスタムモジュール　or カスタムライブラリーの導入手段

自分が見つけた方法については以下のやりかたです。

1. github と連携してモジュールをimport 
1. DBFS上にモジュールをアップロードして、pythonライブラリーパスを追加
1. [libify](https://pypi.org/project/libify/)をインストールし、ノートブック間のimportを実現する -- [設定方法](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0#libify%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%88%A9%E7%94%A8)
1. wheelを作成して、ワークスペースライブラリとしてインストール --- [設定方法](https://qiita.com/taka_yayoi/items/ab89ecb9f2112c3d8985#wheel%E3%81%AE%E4%BD%9C%E6%88%90)
1. wheelを作成して、git上に配置して、pip install ---- [設定方法](https://qiita.com/taka_yayoi/items/ab89ecb9f2112c3d8985#repos%E3%81%AE%E6%B4%BB%E7%94%A8)

番外編）　クラスや関数が書かれた別のnotebookを読み込んで実行する。

他にも方法があるかもしれませんが、もしご存知であれば是非教えてください。

3,4,5 については、すでに設定方法の記事がありますので、そちらをご覧ください。**今回は1,2のモジュールimport方法**と**番外編の別のノートブックを実行する**をご紹介したいと思います。

## 1. githubと連携して、モジュールをimportする

今回は、こちらにある[手順](https://github.com/databricks/files_in_repos)を参考にしました。

### 1) sample code作成

```:sample.py
def n_to_mth(n,m):
  print(n, "to the", m, "th power is", n**m)
```

### 2) ReposによるGit連携

Databricksの [Repos機能を使って Git連携する方法については、こちらをご覧ください。](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)

今回は、https://github.com/databricks/files_in_repos.git　 と連携しました。

連携が完了すると、Reposメニューから files_in_reposが見えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/d4e6daa8-89aa-773c-de25-0dd73fbb9660.png)


### 3) Reposにあるnotebookから、同一の directoryもしくは sub directoryにあるモジュールが importできます。

今回は、files-in-repos notebookから実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/8dc36b34-f9ac-ec16-5af3-162e1f10c080.png)

これは、Reposの current directory pathが自動的にpython pathに追加されているため、上記のようにモジュールを importできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/8f2ca8d9-5dc9-9a83-5eaf-35269d78e1ba.png)


もし、別の directoryにあるノートブックから、実行する場合は、repos pathを事前に追加する必要があります。

```
import sys
import os

# In the command below, replace <username> with your Databricks user name.
sys.path.append(os.path.abspath('/Workspace/Repos/<username>/supplemental_files'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/f9b8de37-58ad-3d02-f066-b1b2f8bca95c.png)


Githubと連携しておくことで、コードの変更などもgit上で行うことができ、CI/CDを実現できるためお勧めです。

## 2. DBFS上にモジュールをアップロードして、pythonライブラリーパスを追加

1. のやり方を応用すれば、gitと連携しなくても、モジュールを簡単に追加することが可能になります。

サンプルコードを DBFS上にアップロードします。
今回は、 /FileStore/custom_module にアップロードします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/cbbeae6a-aa21-a552-4a6e-6acdbf6eb627.png)


追加したDBFSパスを追加することで、モジュールのimportが可能になります。(頭に /dbfsをつけるのに注意ください。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/2863a0a6-2ce9-0aa9-21cc-bb3456d28a0d.png)


こちらの方法は、モジュールの編集時にはローカルで編集したものを毎回アップロードする必要があるため、git連携できるのであれば、1の方法がお勧めです。

# おまけ

## auto reload 機能 
モジュールを修正した場合、以下のコマンドを実行しておくことで、auto reload機能を利用できます。

```
%load_ext autoreload
%autoreload 2
```

sample.py を下記のように修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/821d74b3-666b-c020-2f5d-5cda9ac4c5df.png)

モジュール修正が反映されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/bac86fa0-5fe7-aef8-fe49-1815882d6f80.png)


# 番外編：　クラスや関数が書かれた別のノートブックを実行して読み込む

.pyなどで管理せずに、ノートブックとしてクラスや関数を管理することがデータブリックスでは可能です。

### 1. クラスや関数の書かれたノートブックを作成する

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/c53e58b3-67d3-701b-50f0-56ce55ed6034.png' width='800' />


### 2. ノートブックのパスをコピーする

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/17471e5c-b921-6b8b-ef85-4e98af1770be.png' width='500' />


### 3. 別のノートブックを実行して、関数を呼び出す

```
%run <notebook path>
```


<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/1edf4f2d-9e52-bc19-7f7f-f334d641898b.png' width='800' />


如何だったでしょうか？　フォルダーなどで管理しておけば、モジュール系も含めて管理出来るし簡単にソースの変更が可能になるので便利ですよね。