Databricksでフォルダ名やNotebook名に日本語を使うと困る場合がある

# 先に結論
フォルダ名やNotebook名に**日本語を使用した**場合、[dbutils.notebook.run](https://docs.databricks.com/notebooks/notebook-workflows.html#api) を使って他のNotebookを呼ぶとエラーになるケースがある

# どういうことか
次のようなフォルダ構成のNotebookがあります

```shell
/Users/xxx＠yyy.jp
 |-MyNotebook
 |-Myノートブック
 |-MyNotebookCaller
 |-MyNotebookコーラー
 |-テスト
   |-MyNotebook
   |-MyNotebookCaller
```

このうち、以下のケースに当てはまる場合、[dbutils.notebook.run](https://docs.databricks.com/notebooks/notebook-workflows.html#api) を使った別Notebookの呼び出しに失敗しました

- **呼び出し元**Notebookの名前に`日本語を使用`した場合
  - /Users/xxx＠yyy.jp/`MyNotebookコーラー`
- **呼び出し元**Notebookの格納フォルダの名前に`日本語を使用`した場合
  - /Users/xxx＠yyy.jp/`テスト`/MyNotebookCaller

なお以下のケースの場合は問題なく呼び出しに成功しました

- 呼び出し先Notebookの名前に`日本語を使用`した場合
  - /Users/xxx＠yyy.jp/`Myノートブック`
- 呼び出し先Notebookの格納フォルダの名前に`日本語を使用`した場合
  - /Users/xxx＠yyy.jp/`テスト`/MyNotebook

# 検証
## 各Notebookの説明
`MyNotebookCaller`もしくは`MyNotebookコーラー`から`MyNotebook`にパラメータを渡して呼び出して、`MyNotebook`では受け取ったパラメータを`print`するだけという簡単な処理となります

### /Users/xxx＠yyy.jp/MyNotebook
```python
dbutils.widgets.text("param1", "111")
dbutils.widgets.text("param2", "222")

print("param1:{},param2:{}".format(dbutils.widgets.get("param1"), dbutils.widgets.get("param2")))
```

### /Users/xxx＠yyy.jp/Myノートブック
```python
#/Users/xxx＠yyy.jp/MyNotebookと同じ
```

### /Users/xxx＠yyy.jp/MyNotebookCaller
```python
#Cmd1　同一フォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "./MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)

#Cmd2　同一フォルダのMyノートブックを呼ぶ
dbutils.notebook.run(
  "./Myノートブック",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)

#Cmd3　テストフォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "./テスト/MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)
```
### /Users/xxx＠yyy.jp/MyNotebookコーラー
```python
#/Users/xxx＠yyy.jp/MyNotebookCallerと同じ
```
### /Users/xxx＠yyy.jp/テスト/MyNotebook
```python
#/Users/xxx＠yyy.jp/MyNotebookと同じ
```

### /Users/xxx＠yyy.jp/テスト/MyNotebookCaller
```python
#Cmd1　同一フォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "./MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)

#Cmd2　一つ上のフォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "../MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)
```

##検証① 呼び出し元Notebookの名前に`日本語を使用`した場合
/Users/xxx＠yyy.jp/`MyNotebookコーラー`から同一フォルダのMyNotebookを呼んでみます

```python:Cmd1　同一フォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "./MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)
```
結果として`WorkflowException`が発生しました。
ラテン文字（ASCII文字セット）以外の文字である日本語を使ったことでエラーが返ってきたようです。

```
com.databricks.WorkflowException: com.databricks.common.client.DatabricksServiceHttpClientException: INVALID_PARAMETER_VALUE: Only Latin1 (ASCII) characters are currently supported. Any international characters must be removed or replaced in workflow_context
```

一応テストフォルダのMyNotebookを呼んでみても、

```python:Cmd2　テストフォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "./テスト/MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)
```
こちらも同様に`WorkflowException`が発生しました

```
com.databricks.WorkflowException: com.databricks.common.client.DatabricksServiceHttpClientException: INVALID_PARAMETER_VALUE: Only Latin1 (ASCII) characters are currently supported. Any international characters must be removed or replaced in workflow_context
```

##検証② 呼び出し元Notebookの格納フォルダの名前に`日本語を使用`した場合
/Users/xxx＠yyy.jp/`テスト`/MyNotebookCallerから同一フォルダのMyNotebookを呼んでみます

```python:Cmd1　同一フォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "./MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)
```
こちらも結果として`WorkflowException`が発生しました

```
com.databricks.WorkflowException: com.databricks.common.client.DatabricksServiceHttpClientException: INVALID_PARAMETER_VALUE: Only Latin1 (ASCII) characters are currently supported. Any international characters must be removed or replaced in workflow_context
```

##検証③ 呼び出し先Notebookの名前に`日本語を使用`した場合
/Users/xxx＠yyy.jp/MyNotebookCallerから/Users/xxx＠yyy.jp/`Myノートブック`を呼んでみます

```python:Cmd2　同一フォルダのMyノートブックを呼ぶ
dbutils.notebook.run(
  "./Myノートブック",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)
```

呼び出し先のNotebook名に日本語が使われているにもかかわらず処理が正常終了しました。
渡したパラメータもちゃんと出力されているようです。

```
param1:val1,param2:val2
```

##検証④ 呼び出し先Notebookの格納フォルダの名前に`日本語を使用`した場合
/Users/xxx＠yyy.jp/MyNotebookCallerから/Users/xxx＠yyy.jp/`テスト`/MyNotebookを呼んでみます

```python:Cmd3　テストフォルダのMyNotebookを呼ぶ
dbutils.notebook.run(
  "./テスト/MyNotebook",
  60,
  {
    "param1": "val1",
    "param2": "val2"
  }
)
```

呼び出し先のNotebookのフォルダ名に日本語が使われているにもかかわらず処理が正常終了しました。
渡したパラメータもちゃんと出力されているようです。

```
param1:val1,param2:val2
```


# まとめ
フォルダ名やNotebook名に日本語を使う場合は気をつけましょう