Databricks SDKとは何か

[こちらの記事](https://qiita.com/taka_yayoi/items/79e83aa1124226504892)のようになんとなく使い続けていますが、思った以上に便利なのがDatabricks SDKです。Python、Java、Go、R向けのものが提供されています。

https://docs.databricks.com/ja/dev-tools/sdks.html

サンプルはこちらが豊富です。ライブラリ自体は[PyPI](https://pypi.org/project/databricks-sdk/)で公開されています。

https://github.com/databricks/databricks-sdk-py/tree/main

Databricks SDKを活用することで、Python、Java、Go、Rといったプログラミング言語から直接Databricksを操作することができます。これは自動化に活用できる相当に強力な機能です。[上述の記事](https://qiita.com/taka_yayoi/items/79e83aa1124226504892)でも、手動ではなくPythonからジョブを構成しています。そして、このSDKはDatabricksからの利用にとどまらず、[ローカルマシンからも活用](https://docs.databricks.com/ja/dev-tools/sdk-python.html#get-started-with-the-databricks-sdk-for-python)することができます。

あと、使いこなす際には[マニュアル](https://databricks-sdk-py.readthedocs.io/en/latest/)は必須です。どのDatabricksオブジェクトをどのように操作するのかが網羅されています。

ここではDatabricks環境からPython SDKをウォークスルーします。

https://docs.databricks.com/ja/dev-tools/sdk-python.html

# ワークスペースのクラスターの一覧

ローカルから実行する際には[ライブラリのインストール](https://docs.databricks.com/ja/dev-tools/sdk-python.html#get-started-with-the-databricks-sdk-for-python)が必要ですが、[Databricksワークスペースで実行](https://docs.databricks.com/ja/dev-tools/sdk-python.html#use-the-databricks-sdk-for-python-from-a-databricks-notebook)する際にはすぐにSDKを利用できます。

```py
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

for c in w.clusters.list():
  print(c.cluster_name)
```
```
:
:
Takaaki Yayoi's 16.0 ML Cluster
Takaaki Yayoi's 16.0 ML Single Node GPU Cluster
Takaaki Yayoi's Cluster
```

# ファイルシステムへのアクセス

```py
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()
d = w.dbutils.fs.ls('/')

for f in d:
  print(f.path)
```

```
dbfs:/FileStore/
dbfs:/Users/
dbfs:/Volume/
dbfs:/Volumes/
dbfs:/Workspace/
dbfs:/cluster-logs/
dbfs:/databricks-datasets/
dbfs:/databricks-results/
:
```

# クラスターの作成

```py
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

print("Attempting to create cluster. Please wait...")

c = w.clusters.create_and_wait(
  cluster_name             = 'my-cluster',
  spark_version            = '12.2.x-scala2.12',
  node_type_id             = 'i3.xlarge',
  autotermination_minutes = 15,
  num_workers              = 1
)

print(f"The cluster is now ready at " \
      f"{w.config.host}#setting/clusters/{c.cluster_id}/configuration\n")
```

こちらを実行するとクラスター作成がスタートします。

![Screenshot 2024-12-22 at 20.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0c11ad91-8be2-2684-5584-e1f490639072.png)

クラスターが起動しました！

![Screenshot 2024-12-22 at 20.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/50d7f0ef-8e84-7bb7-4677-00a6f1e328c2.png)

# ジョブの作成

```py
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.jobs import Task, NotebookTask, Source

w = WorkspaceClient()

job_name            = input("ジョブの短い名前 (例: my-job): ")
description         = input("ジョブの短い説明 (例: My job): ")
existing_cluster_id = input("ワークスペース内の既存クラスターのID (例: 1234-567890-ab123cd4): ")
notebook_path       = input("実行するノートブックのワークスペースパス (例: /Users/someone@example.com/my-notebook): ")
task_key            = input("ジョブのタスクに適用するキー (例: my-key): ")

print("ジョブの作成を試みています。お待ちください...\n")

j = w.jobs.create(
  name = job_name,
  tasks = [
    Task(
      description = description,
      existing_cluster_id = existing_cluster_id,
      notebook_task = NotebookTask(
        base_parameters = dict(""),
        notebook_path = notebook_path,
        source = Source("WORKSPACE")
      ),
      task_key = task_key
    )
  ]
)

print(f"ジョブを表示 {w.config.host}/#job/{j.job_id}\n")
```

質問に答えていくとジョブが作成されます。

![Screenshot 2024-12-22 at 20.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ccc7199b-9c8b-e01e-2602-bb19317ff4df.png)

指定された内容でジョブが作成されました。

![Screenshot 2024-12-22 at 20.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b43b1b8a-7f44-530d-c607-525aaa7bea9d.png)

# ボリュームの操作

Databricksにおけるファイル格納場所である[ボリューム](https://docs.databricks.com/ja/volumes/index.html)もSDKで操作できます。ここでは、`catalog`、`schema`、`volume`が作成済みのものとします。また、`upload_file_path`にファイルが存在していることを前提としています。


```py
from databricks.sdk import WorkspaceClient
import io

w = WorkspaceClient()

# ボリューム、フォルダー、およびファイルの詳細を定義します。
catalog            = 'users'
schema             = 'takaaki_yayoi'
volume             = 'data'
volume_path        = f"/Volumes/{catalog}/{schema}/{volume}"
volume_folder      = 'my-folder'
volume_folder_path = f"{volume_path}/{volume_folder}"
volume_file        = 'data.csv'
volume_file_path   = f"{volume_folder_path}/{volume_file}"
upload_file_path = "/Workspace/Users/takaaki.yayoi@databricks.com/20241222_sdk/japan_cases_20220818.csv"

# ボリュームに空のフォルダーを作成します。
w.files.create_directory(volume_folder_path)

# ボリュームにファイルをアップロードします。
with open(upload_file_path, 'rb') as file:
  file_bytes = file.read()
  binary_data = io.BytesIO(file_bytes)
  w.files.upload(volume_file_path, binary_data, overwrite = True)

# ボリュームの内容を一覧表示します。
for item in w.files.list_directory_contents(volume_path):
  print(item.path)

# ボリューム内のフォルダーの内容を一覧表示します。
for item in w.files.list_directory_contents(volume_folder_path):
  print(item.path)

# ボリューム内のファイルの内容を表示します。
resp = w.files.download(volume_file_path)
print(str(resp.contents.read(), encoding='utf-8'))

# ボリュームからファイルを削除します。
w.files.delete(volume_file_path)

# ボリュームからフォルダーを削除します。
w.files.delete_directory(volume_folder_path)
```

```py
/Volumes/users/takaaki_yayoi/data/access.log
/Volumes/users/takaaki_yayoi/data/client_hostname.csv
/Volumes/users/takaaki_yayoi/data/covid_cases.csv
/Volumes/users/takaaki_yayoi/data/japan_cases_20220818.csv
/Volumes/users/takaaki_yayoi/data/covid_cases/
/Volumes/users/takaaki_yayoi/data/my-folder/
/Volumes/users/takaaki_yayoi/data/my-folder/data.csv
Prefecture,Cases,date_parsed
ALL,1,2020-01-16T00:00:00.000Z
ALL,0,2020-01-17T00:00:00.000Z
ALL,0,2020-01-18T00:00:00.000Z
```

Databricksは基本的に**コードファースト**です。[AutoML](https://www.databricks.com/jp/product/automl)や[Genie](https://www.databricks.com/jp/product/ai-bi/genie)のようなGUIフレンドリーの機能を提供してますが、背後には必ず**コードで活用できるようにする**という哲学があります。

GUIでの操作は簡単ではありますが、それを実環境に乗せようとすると途端にバージョン管理や再現性の問題に直面します。なので、Databricksではいかなる物事も**コードで**制御できるようにすることが徹頭徹尾考慮されています。このSDKもDatabricksの環境自体をコードでコントロールできるようにする強力なツールとなっており、マウスやキーボードを用いたDatabricksにおける手作業をほとんどカバーしています([クリーンルーム](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/cleanrooms/index.html)や[Delta Live Tables](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/pipelines/index.html)、[Delta Sharing](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/sharing/index.html)、[Databricks SQL](https://databricks-sdk-py.readthedocs.io/en/latest/workspace/sql/index.html)も対応しています！)。このSDKはまさにDatabricksの哲学を具現化するものだと個人的には考えています。効率化、自動化においては非常に強力な武器となりますので、是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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