【Databricks】PythonでNotebookの複数削除を行ってみる

はじめに

この記事は、以前投稿した「【Databricks】PythonでNotebookのフォルダ移動を実現してみた」に関連したものとなっています。
まだ、読んでいない方はぜひそちらもチェックしてみてください。

以前の記事では、DatabricksのAPIを使ってNotebookのフォルダ間移動を実現すると言うものでしたが、
その際の注意点として、「Notebookのエクスポート&インポート時、元Notebookは残ってしまうため、削除する必要がある」と記載していました。
今回はそのNotebookの削除をPythonで行う方法を記事にしました。

利用するDatabricks Rest API

注意点

  • 削除したNotebookは元に戻せないため、実行対象やタイミングは十分に検討してから行なってください。
  • 今回使用するAPIはフォルダを指定すれば、フォルダごと削除できるものなので、パスの指定は十分にチェックしてください。
  • 前提として、ある程度Pythonの知識とRestAPIの知識があると良いです。

実践

さて、実際にコードを書きながら実践してみましょう。
まずは、複数件で行う前に1件のNotebookを削除させるコードを書いてみましょう。
具体的な動きは以下になります。

  • Workspaceにある「sample1」フォルダ内の「notebook_sample1」を削除する

Notebookの削除をするためには

まず初めにNotebookを1件削除する方法を見ていきましょう。
削除を行うライブラリは以下です。

【Delete a workspace object | Workspace API | REST API reference | Databricks on AWS】

完成形

まず初めに、上記ライブラリを利用した記述の完成形を見てみましょう。

# 指定のNotebookを削除
import requests
import json

# 対象のNotebookパス(/Workspaceから指定すること)
notebook_path = "/Workspace/Users/xxxxxxxxxxxxxx/sample1/notebook_sample1"

# Databricksのホスト名とパーソナルアクセストークン
databricks_host = "xxxxxx"
databricks_token = "xxxxxx"

# 削除用のエンドポイント
url = f"https://{databricks_host}/api/2.0/workspace/delete"

# 認証ヘッダーを設定
headers = {
    'Authorization': f'Bearer {databricks_token}',
    'Content-Type': 'application/json'
}

# 削除用のパラメータ
param = {
    'path': notebook_path
}

response = requests.post(url, headers=headers, data=json.dumps(param)).json()
print(response)

上記を実行すると、成功した場合レスポンスとして、このように空の状態が返されてきます。

{}
ライブラリのインポート

それでは、上記完成形コードを細かく見ていきましょう。
まずは、ライブラリのインポートですが、このコードではRestAPIを呼び出すための「requests」、返ってきたレスポンスをJson形式に変換する「json」をインポートしています。

# 指定のNotebookをエクスポート
import requests
import json
変数定義

次に、以下部分では実行に必要な情報を変数に代入しています。

# 対象のNotebookパス(/Workspaceから指定すること)
notebook_path = "/Workspace/Users/xxxxxxxxxxxxxx/sample1/notebook_sample1"

→削除対象のNotebookのパスです。「/Workspace」から指定することがポイントです。
※Notebookのパス取得方法については以下公式ドキュメントを参考にしてください。
【ノートブックの管理|Databricks on AWS】

# Databricksのホスト名とパーソナルアクセストークン
databricks_host = "xxxxxx"
databricks_token = "xxxxxx"

→RestAPIを呼び出すために必要な情報です。トークンの詳細については以下公式ドキュメントを参照してください。
【Databricks個人用アクセストークン認証 | Databricks on AWS】

# 削除用のエンドポイント
url = f"https://{databricks_host}/api/2.0/workspace/delete"

→削除APIのエンドポイントです。ブログ投稿時点での最新バージョンは2.0です。

# 認証ヘッダーを設定
headers = {
    'Authorization': f'Bearer {databricks_token}',
    'Content-Type': 'application/json'
}

→API接続するための認証ヘッダーです。これらの設定をしないと正しくAPIに接続できません。

# 削除用のパラメータ
param = {
    'path': notebook_path
}

→APIリクエストをする際に必要な情報です。

項目名 説明
path 削除対象のNotebookのパス
リクエストの記述

最後に、リクエスト部分の記述です。
requestライブラリのpost関数の引数にそれぞれ定義した変数を設定します。
dataはJson形式である必要があるため、json.dumpsを利用して変換しましょう。
また、json関数もつけることで、返ってきたレスポンスをJson形式に変換し、後々の処理をしやすいようにしています。

response = requests.post(url, headers=headers, data=json.dumps(param)).json()
print(response)

複数件実施するには?

さて、ここまでは1件のNotebookを対象としてきました。
ここから複数件のNotebookを対象にしたい場合どうするのかをみていきましょう。

サンプルとして、以下3件のNotebookの情報をDataFrameに用意します。

delete_file
/Workspace/Users/xxx/test/notebook1
/Workspace/Users/xxx/test/notebook3
/Workspace/Users/xxx/test/notebook5

今回はコードにベタ書きしますが、実際の案件ではCSVを読み込むなどしてメンテナンスがしやすいようにしておきましょう。

完成形

まずは、複数件実施の場合の完成形をみてみましょう。

# 指定のNotebookをエクスポート
import requests
import json

# Dataframeの定義
df = spark.createDataFrame([
  (
    '/Workspace/Users/xxx/test/notebook1'
  ), (
    '/Workspace/Users/xxx/test/notebook3'
  ), (
    '/Workspace/Users/xxx/test/notebook5'
  )
  ], ['delete_file'])

# Databricksのホスト名とパーソナルアクセストークン
databricks_host = "xxxxxxxxxxxxxx"
databricks_token = "xxxxxxxxxxxxxx"

# エンドポイント
url = f"https://{databricks_host}/api/2.0/workspace/delete"

# 認証ヘッダーを設定
headers = {
    'Authorization': f'Bearer {databricks_token}',
    'Content-Type': 'application/json'
}

for row in df.collect():
  # 削除の実施
  export_param = {
    'path': row['delete_file']
  }
  response = requests.post(url, headers=headers, data=json.dumps(param)).json()
  print(response)
ポイント

ポイントとなる点は以下になります。

for row in df.collect():

DatabricksのAPIでは、複数件を一気に処理するAPIは用意されていないため、
Dataframeの一行ずつ処理を行う必要があるのです。

さいごに

いかがだったでしょうか?
今回は、Pythonを使ってNotebookを複数削除する方法を記述してみました。
以前の記事でも記載した通り、作業の効率化や保守の観点からコーディングした方がよい方法であるパターンも存在します。
ただし、すべてのケースでコーディングが正解とは限りません。手作業の方が柔軟だったり、コストを抑えられる場面もあります。
便利だからといって無理にコード化するのではなく、目的に応じてバランスよく選択していきましょう!