Databricksにて取得元ファイルを切り替えて変数を動的に取得する方法

## 概要
Databricksにて、変数を保持させた複数のファイルがある場合に、動的に取得元のファイルを切り替えた変数により処理を実行する方法を紹介します。本手順は、[files in a Databricks repo](https://docs.databricks.com/repos.html#work-with-non-notebook-files-in-a-databricks-repo) を利用します。

下記のように変数を保持した2つのファイルがあり、取得元のファイルを切り替えることで変数を動的に取得する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7c08d763-0637-74e5-550e-103d3e1b34a9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e751e9ca-cca5-3d27-41e6-e0161e8e077e.png)

変数にて取得元のファイル名である`table__002`を指定して、table__002の辞書型変数を取り出します。

```py
# 変数取得元のファイル名を指定
variable_file_name = 'table__002'

# 取得
import importlib
var = importlib.import_module(variable_file_name)

# 変数のデータ型と中身を表示
import pprint
print(type(var))
print('\n')
pprint.pprint(var.tables_info_list)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0fe6c23a-f4d6-103f-d960-d8e3b720cf6e.png)

詳細なコードを確認したい方は、下記のGithubページにてご確認ください。

https://manabian-.github.io/databricks_tecks_for_qiita/#how_to_get_variables_dynamically_by_switching_files/executor.html

DatabricksのコードをGihtub Pagesで公開する方法については、下記の記事で紹介してます。

https://qiita.com/manabian/items/3d74c18136508e0ac971


## 詳細な手順
### 事前準備
下記の構成で、ディレクトリ、ノートブック、及び、ファイルを作成。

```text
/Workspace/Repos/databricks_test/databricks_test2
|--config
|  |--table__001.py
|  |--table__002.py
|--executor
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/99b3f0fb-dd98-2588-bd08-4901154dfe2b.png)


table__001.pyには、下記を記載

```py
tables_info_list = {
    'table_conf_name' : 'table__001',
    'deploy_target_db_and_table_names': {
        'dev' : [
            'test_deploy_dev.table__001',
        ],
    },
    'data_source' : 'delta',
    'location'    : {
        'dev' : '/tmp/dev/test_deploy/table__001',
    },

}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/42871843-7133-7d93-cc37-81db34d0e3a2.png)


table__002.pyにて、下記を記載

```py
tables_info_list = {
    'table_conf_name' : 'table__002',
    'deploy_target_db_and_table_names': {
        'dev' : [
            'test_deploy_dev.table__002',
        ],
    },
    'data_source' : 'delta',
    'location'    : {
        'dev' : '/tmp/dev/test_deploy/table__002',
    },

}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b472b998-9815-ae88-83fc-44785dce6ad2.png)

### ディレクトリにあるファイルを確認

```py
file_dir = os.path.abspath('./config')
print(file_dir)

import glob
files = glob.glob(file_dir + '/*')
for file in files:
    print(file)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0bf1718f-8a5e-141e-38ac-e6378663d053.png)


### ファイルの確認

```py
file_path = '/Workspace/Repos/databricks_test/databricks_test2/config/table__001.py'
 
with open(file_path, 'r') as f:
    file_contents = f.read()
    print(file_contents)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3e0e32f8-0c2f-aeb9-f6f3-598ab11c98ab.png)


###  静的にファイルの変数を取得

```py
import sys
import os
sys.path.append(file_path)

import table__002 as var

import pprint
print(type(var.tables_info_list))
print('\n')
pprint.pprint(var.tables_info_list)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/29f04d5c-fdd8-ed12-a4ea-bfbd0318a5ef.png)


###  動的にファイルの変数を取得（取得元のノートブック名を変数により切り替える方法）
```py
# 変数取得元のファイル名を指定
variable_file_name = 'table__002'

# 取得
import importlib
var = importlib.import_module(variable_file_name)
```

```py
# 変数のデータ型と中身を表示
import pprint
print(type(var))
print('\n')
pprint.pprint(var.tables_info_list)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0fe6c23a-f4d6-103f-d960-d8e3b720cf6e.png)



## 注意事項
### `dbutils.fs.ls`ではファイルを確認する際には`file:`で始める必要があること

```py
file_path = 'file:/Workspace/Repos/databricks_test/databricks_test2/config/table__001.py'
 
dbutils.fs.ls(file_path)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bc44c808-ff5d-9602-6194-c9d9df91c406.png)


### Databricksノートブックの中身を確認することができないこと

```py
try:
    file_path = '/Workspace/Repos/databricks_test/databricks_test2/config/sample_notebook'
 
    with open(file_path, 'r') as f:
        file_contents = f.read()
        print(file_contents)
except:
    import traceback
    traceback.print_exc()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a709972f-9dfb-49af-dc28-e9768c6d38a0.png)

Databricksノートブック名を動的に変更して変数を取得する方法としては、`dbutils.notebook`を利用する方法があります。