条件に一致するDatabricks Job一覧取得方法

# 対象読者
 - チームで[Databricks](https://databricks.com/jp/)を利用している方
 - 既存のJobで細かい条件に一致するものの洗い出しを行いたい方

# 目的
Jobがたくさんあるが、その中でも現在定期実行されているものを確認する。
(応用すれば他の情報でも抽出可能とおもわれます。)



# 流れ
 - [Databricks CLI](https://docs.databricks.com/dev-tools/cli/jobs-cli.html)を用いてJob一覧とそれらに紐づく情報をjsonで出力し、
 - jupyter notebookで読み込み、
 - 確認したい情報を抽出しcsvで出力します。


# 環境
 - Mac
 - Databricks on AWS
 - python
 - jupyter notebook


### 事前準備
 - [Databricks CLI](https://docs.databricks.com/dev-tools/cli/jobs-cli.html)が利用可能なように準備をしてください。
 - [jupyter notebook](https://jupyter.org/)が利用可能なように準備をしてください。


# コード

### Job一覧取得
Databricks CLIが利用可能となったターミナルの、作業したいdirectoryで実行してください。

```shell
$ databricks jobs list --output JSON > job_list.json
```

何もつけない状態だとJob_idとJob_nameのみが出力されます。
`--output JSON`というオプションをつけることで詳細な情報まで出力されます(JSON形式)。

### 欲しい情報のみ取得
以下はjupyter notebookで実行します。

```python
import json
from pandas.io.json import json_normalize

json_open = open('./job_list.json', 'r')
json_load = json.load(json_open)

df_json = json_normalize(data=json_load, record_path='jobs')
```
jsonを読み込んでdataflameに変換しました。
列数が多いため、欲しい情報の含まれてそうな列のみを抽出します。
例えば定期実行スケジュールの情報が欲しい場合は'schedule'という文字列を含む列名を取得します。


```python
temp_col = [item for item in df_json.columns if item.find('schedule') != -1]
temp_col
```
この結果
`['settings.schedule.quartz_cron_expression',
 'settings.schedule.timezone_id',
 'settings.schedule.pause_status']`
とでました。
これに、
'job_id'列と
設定されたnotebookである'settings.notebook_task.notebook_path'列
を加えて抽出します。

```python
df_results = df_json[['job_id',
                      'settings.name',
                      'settings.schedule.quartz_cron_expression',
                      'settings.schedule.pause_status',
                      'settings.notebook_task.notebook_path',
        ]]
df_results
```
とすると、欲しい情報を持つ列のみに絞られたJOB一覧が出ました！

イメージ


|  job_id  |  settings.name |  settings.schedule.quartz_cron_expression	| settings.schedule.pause_status	 |settings.notebook_task.notebook_path|
| ---- | ---- | ---- | ---- | ---- |
|  1  |  AAA  |  NaN  |  NaN  |  /path/to/your/notebook/AAA  |
|  2  |  BBB  |  0 0 12 * * ?  |  UNPAUSED	  |  /path/to/your/notebook/BBB  |
|  3  |  CCC  |  0 15 10 ? * *  |  PAUSED	  |  /path/to/your/notebook/CCC  |

settings.schedule.quartz_cron_expressionはcronの記法で書かれているとおもわれますので、読み解きが必要な場合は、
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
などを参考にしてください。


#欲しい条件でfilter
「現在も定期実行され続けているもの」が今回出したい条件となります。
「settings.schedule.pause_status	が'UNPAUSED'のもの」が条件に該当するとおもわれます。

前項で出した一覧を

```python
df_results.to_csv('./job_list.csv')
```

で出力して、Googleスプレッドシートやエクセルにしてからfilterするのもありと思いますし、


```python
df_filtered = df_results[df_results['settings.schedule.pause_status'] == 'UNPAUSED']
df_filtered.to_csv('./job_list.csv')
```
でfilterしたものを出力するのもありと思います。

# 感想
もしかするとこの記事を皆様が読まれているころにはDatabricks側で条件を指定したJob一覧の抽出が可能な機能が存在しているかもしれないですが、私がこの作業が必要となり、調べたときには見つからなかったため、調べながら実施したことを記事とします。


# 参考資料
 - Databricks CLIのマニュアル
    - https://docs.databricks.com/dev-tools/cli/jobs-cli.html
 - jsonの読み込み
    - https://qiita.com/kikuchiTakuya/items/53990fca06fb9ba1d8a7
 - jsonのdf化
    - https://qiita.com/simonritchie/items/7e50b47ccadbbb0fba57
 - 特定の文字を含む列の名称を取得
    - https://qiita.com/haru1977/items/2892480d31c296f2ec8e
 - cronの記法 
   - http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html