Databricksワークフローのタスクバリューを試してみる

こちらで説明されているワークフローのタスクバリューを実際に試してみました。

https://qiita.com/taka_yayoi/items/792115537b85db5ad108

# タスクバリューとは

タスクバリュー(Task value)とはジョブを構成するタスクで任意の値を設定、参照できる機能です。これまでは、ノートブック間で値をやり取りするには[ノートブックワークフロー](https://qiita.com/taka_yayoi/items/118fbc0ad8fa5471bc88)を構成し、[ウィジェットユーティリティ(dbutils.widgets)](https://qiita.com/taka_yayoi/items/3717623187859809515d#%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3dbutilswidgets)を使ってノートブック間で値をやり取りしていましたが、こちらはネイティブにジョブで利用できる機能となります。値のやり取りには[ジョブユーティリティ(dbutils.jobs)](https://qiita.com/taka_yayoi/items/3717623187859809515d#%E3%82%B8%E3%83%A7%E3%83%96%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3dbutilsjobs)を使用します。

# ノートブックの準備

タスクバリューを設定するノートブックと、タスクバリューを取得するノートブックを作成します。`dbutils.jobs.taskValues.set`でタスクバリューを設定します。`key`がタスクバリューのキー、`value`が設定値となります。ここでは固定値を指定していますが、通常は何かしらの処理結果になります。

```py:notebook A
dbutils.jobs.taskValues.set(key   = "my-key", \
                            value = 5)
```

`dbutils.jobs.taskValues.get`でタスクバリューを取得します。`taskKey`がタスクバリューを取得するタスクの名称です。このタスク名は次のステップでジョブを作成する際に指定します。`key`がタスクバリューのキーですが、`default`と`debugValue`については説明が必要です。

```py:notebook B
task_value = dbutils.jobs.taskValues.get(taskKey    = "my-task", \
                            key        = "my-key", \
                            default    = 7, \
                            debugValue = 42)

print(task_value)
```

`default`は名前の通りデフォルト値となります。タスクバリューの取得には上述の`taskKey`と`key`で検索を行います。`default`は、この組み合わせのタスクバリューが存在しない場合に設定される値となります。使い方としては、前段の処理で何かしら問題があった場合にはタスクバリューを設定せず、後段ではデフォルト値を用いるというものが考えられます。

`debugValue`も名前の通り、デバッグ用の値となります。タスクバリューはジョブ実行の中で使用される機能です。一方、デバッグのためにジョブに設定されているノートブックの動作確認を行いたいというケースもあると思います。この場合、ジョブとして実行するのではなく、クラスターにノートブックを実行して動作を確認することになります。そうすると、タスクバリューの値を取得できないことになりますが、その際に`debugValue`を設定しておくことで、インタラクティブにノートブックを実行する場合でもその値を用いて後段の処理を実行することができるようになります。

上記`default`の挙動を確認するためのノートブックも作成しておきます。notebook Bとの違いはkeyが`my-key2`となっているところだけです。これは前段のタスクでは設定されないキーとなります。

```py:notebook C
task_value = dbutils.jobs.taskValues.get(taskKey    = "my-task", \
                            key        = "my-key2", \
                            default    = 7, \
                            debugValue = 42)

print(task_value)
```

# ジョブの作成

上のノートブックを用いてマルチタスクのジョブを構成します。notebook Aからnotebook Bとnotebook Cそれぞれに分岐する形にしています。

![Screen Shot 2022-08-08 at 8.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cc2cd623-fe7c-0c3c-196d-ec1326e03c96.png)

# ジョブの実行

ジョブの実行を行うとnotebook Aでタスクバリューが設定され、notebook Bでそのタスクバリューが参照されます。notebook Cは存在しないタスクバリューを参照します。

**ジョブの実行**にアクセスすると、実行結果を確認することができます。
![Screen Shot 2022-08-08 at 8.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6d6892e9-4ab6-d477-a249-ab7429e64179.png)

ここで重要なのはnotebook Aが設定されている**my-task**です。ノートブック名の右に`< > 1`という表示があります。これがタスクバリューが設定されていることを意味しています。
![Screen Shot 2022-08-08 at 8.21.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1c79921f-87c5-d8d9-dd32-0d2413b37083.png)

タスク**my-task**をクリックすると、右のペインに詳細が表示されます。タスクバリュー`my-key`が`5`に設定されていることを確認できます。
![Screen Shot 2022-08-08 at 8.22.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2dc2d9fd-2ed8-9705-f3a0-67362cdb0ef9.png)

:::note info
**注意**
画面上`タスク値`という表記になっていますが、タスクバリューに修正します。
:::

そして、設定したタスクバリューを参照しているnotebook Bのタスクをクリックすると、`5`を取得できていることがわかります。
![Screen Shot 2022-08-08 at 8.23.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d6b3420f-8286-1c7f-f5f3-254068696703.png)

存在しないタスクバリューを参照しているnotebook Cのタスクをクリックすると、デフォルト値の`7`が表示されていることがわかります。
![Screen Shot 2022-08-08 at 8.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71e996f7-f620-d4af-d548-fe2493583a03.png)

最後に、ジョブではなくインタラクティブにタスクバリューを取得してみます。
![Screen Shot 2022-08-08 at 8.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/06ed2d8c-33b4-acb0-8160-4a893a288224.png)

`debugValue`の`42`が表示されます。

このように、これまで以上に表現豊かなジョブを記述できるようになるタスクバリュー、是非お試しください！

### Databricks 無料トライアル

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