Databricks Reposにおける任意のファイルの取り扱い

Databricks Reposを使うことで、GitHub、Azure DevOps、AWS CodeCommitなどとDatabricksワークスペースを同期できるようになります。それ以外の機能として、ノートブック以外の任意のファイルをDatabricks上で利用できるようになる機能があります。これを**Files in Repos**機能と呼びます。

**Files in Repos**機能の一般的なユースケースは:

- カスタムのPython、Rのモジュール。これらのモジュールをRepoに取り込むことで、Repoのノートブックは`import`文を用いてこれらの関数にアクセスすることができます。
- Repoの`requirements.txt`ファイルで環境を定義。ノートブックの環境を作成し、パッケージをインストールするには、ノートブックから`pip install -r requirements.txt`を実行するだけです。
- Repoに小規模データファイルを格納。これは開発やユニットテストで有用です。Repoのデータファイルの最大サイズは100MBです。Databricks Reposでは小さいファイル(< 10 MB)のエディタを提供します。

本記事では、この機能をウォークスルーします。

Databricks Reposに関してはこちらをご覧ください。

https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140

:::note
GithubなどのリポジトリとDatabricksワークスペースを同期する機能`Repositories`を略して**Repos**と呼んでいます。このため、ここでは、個々のリポジトリを**Repo**と呼称します。
:::

今回使うサンプルノートブックはこちらです。上のマニュアルで紹介されているサンプルノートブックです。

https://github.com/taka-yayoi/public_repo/tree/main/repos_arbitrary_files

# 環境の準備

まず、上記サンプルノートブックで使用するファイルを利用できるようにするために、リポジトリをクローンします。

1. Databricksにログインします。
1. サイドバーからリポジトリを選択し、右上の**リポジトリを追加**ボタンをクリックします。
![Screen Shot 2022-04-24 at 10.40.14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b23df95e-536a-f5e6-e5d2-fc2319be39ae.jpeg)
1. **GitレポジトリのURL**に`https://github.com/databricks/files_in_repos`を入力し、**作成**をクリックします。
![Screen Shot 2022-04-24 at 10.10.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b243a6e7-d34b-3c17-dd46-64371ecaab5a.png)
1. これでリポジトリがクローンされました。
![Screen Shot 2022-04-24 at 10.11.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/10e968d4-d2ca-357b-aa74-f1168eca5712.png)
1. すでに`files-in-repos`というノートブックがクローンされているので、こちらを使ってもいいですが、日本語訳したものが良い場合には、元のファイルの名前を変更の上、[こちら](https://github.com/taka-yayoi/public_repo/tree/main/repos_arbitrary_files)からpyファイルをダウンロードし、同じ場所にインポートしてください。
1. 画面左上から稼働中のクラスターを選択し、ノートブック`files-in-repos`をクラスターにアタッチして準備は完了です。Reposのノートブックを開いた際には、画面左上ノートブック名の左に**main**という形で同期しているブランチが表示されます。
![Screen Shot 2022-04-24 at 10.14.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0387aa47-0839-192c-af8a-b2ff8c54637f.png)


# Pythonモジュールの取り扱い

現在の作業ディレクトリ(`/Workspace/Repos/<username>/<repo_name>`)は自動的にPythonパスに追加されます。現在のディレクトリ、サブディレクトリにある任意のモジュールをインポートすることができます。

```py:Python
# パスの表示
import sys
print("\n".join(sys.path))
```

![Screen Shot 2022-04-24 at 10.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3d83fb7c-78c0-f624-541a-69e4168ea65d.png)

```py:Python
from sample import n_to_mth
n_to_mth(3, 4)
```

![Screen Shot 2022-04-24 at 10.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1c2fa482-8fa8-6fac-9dc6-8d96efd039f7.png)

他のリポジトリからモジュールをインポートするには、Pythonパスにそれらを追加します。例えば、Pythonモジュール`lib.py`を持つ`supplemental_files`というRepoがある場合には、次のセルのようにすることでインポートすることができます。

```py:Python
import sys
import os

# 以下のコマンドでは <username> をご自身のDatabricksユーザー名で置き換えてください
sys.path.append(os.path.abspath('/Workspace/Repos/takaaki.yayoi@databricks.com/supplemental_files'))

# これで、supplemental_files RepoからPythonモジュールをインポートすることができます
import lib
```

# 自動リロード

長方形の面積を計算する関数`rectangle`を追加するために`sample.py`を編集したとします。以下のコマンドを実行することでモジュールは自動でリロードされます。

```py:Python
%load_ext autoreload
%autoreload 2
```

```py:Python
# このコマンドを動作させるためには、`sample.py`を編集して、以下の関数を追加する必要があります:
# def rectangle(a, b):
#    return a * b

# そして、このセルを実行します
from sample import rectangle
rectangle(5, 4)
```

上の指示に従って、Repoにある`sample.py`を開きます。
![Screen Shot 2022-04-24 at 10.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/125d95bd-8723-2ba7-4232-1654934ad42d.png)


エディタが表示されます。
![Screen Shot 2022-04-24 at 10.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/204f110a-4383-9b1b-6ed1-87be1635409d.png)

ここに関数を追加します。ファイルは自動で保存されます。
![Screen Shot 2022-04-24 at 10.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/14e2a51e-9f14-1580-e721-5a6c4436bb5f.png)

```py:Python
# そして、このセルを実行します
from sample import rectangle
rectangle(5, 4)
```

追加された関数が実行できていることがわかります。
![Screen Shot 2022-04-24 at 10.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f7d3433f-baf1-ade6-b5c0-faeb086bb2ba.png)

# `requirements.txt`ファイルからのパッケージのインストール

```py:Python
pip install -r requirements.txt
```

![Screen Shot 2022-04-24 at 10.21.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/411d7c09-1acf-e38e-ff00-9e1b167491e0.png)

# 小さいデータファイルの取り扱い

Repoに小さいデータファイルを格納することができ、開発やユニットテストが便利になります。Repoにおけるデータファイルの最大サイズは100MBです。Databricks Reposは小さいファイル(< 10 MB)のエディタを提供します。Python、シェルコマンド、pandas、Koalas、PySparkでデータファイルを読み込むことができます。

## Pythonによるファイルの参照

```py:Python
import csv
with open('data/winequality-red.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)
```

![Screen Shot 2022-04-24 at 10.23.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a696503b-2f99-0cbc-1804-9d93e0b0b57d.png)

## シェルコマンドによるファイルの参照

```bash:Bash
%sh head -10 data/winequality-red.csv
```

![Screen Shot 2022-04-24 at 10.23.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/70b0ab9e-eccb-f370-fa82-2b96fecc691d.png)

## pandasによるファイルのロード

```py:Python
import pandas as pd

df= pd.read_csv("data/winequality-red.csv")
display(df)
```

![Screen Shot 2022-04-24 at 10.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/34ef9bf6-f36f-31bc-e935-08ceebb0d630.png)

## Koalasによるファイルのロード

Koalasでは絶対ファイルパスが必要です。

```py:Python
import os
import databricks.koalas as ks

df= ks.read_csv(f"file:{os.getcwd()}/data/winequality-red.csv") # Koalasでは "file:" プレフィクスと絶対ファイルパスが必要です
display(df)
```

![Screen Shot 2022-04-24 at 10.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9c5b4575-b3cd-0c8c-3a0b-e6f8b06ccb43.png)

:::note
KoalasプロジェクトはSparkプロジェクトとマージされました。ビルトインのpandas API on Sparkのご利用を検討ください。
:::

## PySparkによるファイルのロード

PySparkでは絶対ファイルパスが必要です。

```py:Python
import os

df=spark.read.csv(f"file:{os.getcwd()}/data/winequality-red.csv", header=True) # PySparkでは "file:" プレフィクスと絶対ファイルパスが必要です
display(df)
```

![Screen Shot 2022-04-24 at 10.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/28220881-337a-68cc-687f-9f6a470b64b6.png)

# 制限

プログラムからファイルに書き込みを行うことはできません。


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)