Databricksファイルシステム、ワークスペースファイル、ボリュームの違い

こちらの記事を書いてから10ヶ月ほど経ちました。

https://qiita.com/taka_yayoi/items/075c6b3aeafac54c8ac4

こちらの記事では、[DBFS(Databricks File System)](https://docs.databricks.com/ja/dbfs/index.html)とクラスターローカルのファイルシステムのみに言及しました。

その後、ファイルを取り扱う目的で以下の機能がDatabricksに導入されました。

- [ワークスペースファイル](https://docs.databricks.com/ja/files/workspace.html)
- [ボリューム](https://docs.databricks.com/ja/data-governance/unity-catalog/create-volumes.html)

こちらの記事では、これらの新機能とDBFSの違いをまとめます。

# サマリー

| 観点 | DBFS | ワークスペースファイル | ボリューム |
|:--|:--|:--|:--|
| ワークスペース横断でのアクセス  | 不可  | 不可  | 可能  |
| アクセスコントロール  | 不可  |   ファイル単位に設定可能| ボリューム単位に設定可能  |
| ファイルエディタのサポート  | 無し  | 有り  | 無し  |
| ファイルサイズの制限  | アップロードできるファイルサイズは最大2GB  | 200MB  | 無し  |
| 想定用途  |  一時ファイルの保存 |  Pythonモジュールのインポート、git連携 | 大規模ファイルの読み書き  |
| その他  |  プロダクション用途での利用は非推奨 |   | <ul><li>Unity Catalogが前提<li>ボリュームのファイルからテーブルを作成するとリネージを生成</ul>  |

ここでの**ワークスペース横断でのアクセス**とは、複数のDatabricksワークスペースから同じファイルにアクセスできるかどうかを意味しています。

ノートブックからインポートするpyファイルであれば**ワークスペースファイル**、それ以外の非構造化データファイルであれば**ボリューム**を使うのが推奨となります。

# DBFSとは

(少なくとも私がDatabricksに入社した3年前の)昔から存在しているファイルシステム。アクセスコントロールができないので、プロダクション用途での利用はお勧めしていません。現時点では、一時ファイルを格納しておくくらいしか使い道はありません。

https://qiita.com/taka_yayoi/items/897264c486e179d72247

- ワークスペース横断でのアクセス: 不可
- アクセスコントロール: 不可
- ファイルエディタのサポート: 無し
- ファイルサイズの制限: アップロードできるファイルサイズは最大2GB
- 想定用途: 一時ファイルの保存
- その他: プロダクション用途での利用は非推奨

GUIからであれば、カタログエクスプローラから参照することができます。これ以外にPythonなどのプログラミング言語から操作することができます。
![Screenshot 2023-10-26 at 16.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0b079c45-0dd4-c524-60bb-aab0bada2ff8.png)

パスの指定方法は使用するコマンドによって変わります(これがややこしい)。

PySparkなどの分散ファイルシステム前提のコマンドでは何も変更を加えずにファイルへのパスを指定します。以下の例では明示的に`dbfs:`スキーマを付与しています。

```py
df = spark.read.format("delta").load('dbfs:/databricks-datasets/learning-spark-v2/people/people-10m.delta')
display(df)
```

Pandasのようなローカルファイル前提のコマンドでは、パスの先頭に`/dbfs`を追加します。

```py
import pandas as pd

df = pd.read_csv("/dbfs/databricks-datasets/wine-quality/winequality-red.csv", sep=";")
display(df)
```

# ワークスペースファイルとは

ノートブックと同じ場所でノートブック以外のPythonファイルなどを格納、編集できるようにした機能。元々は[Repos](https://docs.databricks.com/ja/repos/index.html)限定の機能でしたが、2023/4からワークスペースのどこでも利用できるようになりました。

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

- ワークスペース横断でのアクセス: 不可
- アクセスコントロール: ファイル単位に設定可能
- ファイルエディタのサポート: 有り
- ファイルサイズの制限: 200MB
- 想定用途: Pythonモジュールのインポート、git連携

以下のようにpyファイルを作成します。
![Screenshot 2023-10-26 at 16.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/716cf43b-71a4-17bf-4b3d-82dee5ea372b.png)

:::note
**注意**
ワークスペースファイルを作成する際には、ノートブックではなく**ファイル**を作成してください。ノートブックの名称を`xxx.py`としてもワークスペースファイルとしては認識されません。
![Screenshot 2023-10-27 at 9.48.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b2485812-ff77-94e3-0218-ac37eb7b1bbb.png)
:::

ノートブックから直接`import`することができます。
![Screenshot 2023-10-26 at 16.41.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/48179250-56b3-65d2-b0b0-0c02e950cafa.png)

ワークスペースファイルのパスの指定方法は以下の通りとなります。どのようなコマンドであってもパスの指定方法は依存しません。

**Repos内のファイル**

`file:/Workspace/Repos/<user-folder>/<repo-name>/path/to/file`

**それ以外の場所のファイル**

`file:/Workspace/Users/<user-folder>/path/to/file`

以下のようにしてアクセスできます。

```sh
%sh
head /Workspace/Users/takaaki.yayoi@databricks.com/20231025_volumes/power.py
```
```
def n_to_mth(n,m):
  print(n, "の", m, "乗は", n**m)
```

# ボリュームとは

ファイル格納の機能としては最新のものです。2023/7にパブリックプレビュー。

https://qiita.com/taka_yayoi/items/3acb6c69458f9c1253be

- ワークスペース横断でのアクセス: 可能
- アクセスコントロール: ボリューム単位に設定可能
- ファイルエディタのサポート: 無し
- ファイルサイズの制限: 無し
- 想定用途: 大規模ファイルの読み書き
- その他: Unity Catalogが前提。ボリュームのファイルからテーブルを作成するとリネージを生成

ボリューム上のファイルもカタログエクスプローラから確認できます。
![Screenshot 2023-10-26 at 16.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e16f2c72-bb45-e56e-6a35-fd2da7fe2d1f.png)

ボリューム上のファイルからテーブルを作成すると、リネージも作成されます。
![](https://camo.qiitausercontent.com/fc02d88320cf9ef92f8ac3f19fa28c3bc12603cf/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f37343731326539612d653531642d613231362d303832392d3137356139646533363765322e706e67)

ワークスペースファイルと同じようにPythonからアクセスできます。
![](https://camo.qiitausercontent.com/053b566f1964c036c23c53dc07ec10ea51807c8c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313136383838322f62396331306237642d343665312d366465362d626263642d3234643230306338386236362e706e67)

パスの指定方法は一番シンプルです。コマンドに関係なく以下の通りとなります。

`/Volumes/<catalog>/<schema>/<volume>/<path>/<file-name>`

```sh
%sh
ls /Volumes/takaakiyayoi_catalog/quickstart_schema/quickstart_volume/catsanddogs/test_set/test_set/cats
```
```
_DS_Store
cat.4001.jpg
cat.4002.jpg
cat.4003.jpg
cat.4004.jpg
cat.4005.jpg
cat.4006.jpg
cat.4007.jpg
cat.4008.jpg
cat.4009.jpg
cat.4010.jpg
cat.4011.jpg
```

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

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