Glue(JupterNotebook)でモジュールを使う

# はじめに

Jupyter Nootebookで開発できるようになったGlueがとても便利になったため、最近よく触っています。

今回はモジュールを使う方法について記事にしました。

- デフォルトで入っているモジュールは何か
- 入っていないモジュールを扱うにはどうすればいいのか
    - インタラクティブセッションで（でも）扱う方法


# デフォルトで入っているモジュール

以下のコマンドで確認できます。
```
!pip3 list
```

numpyやpandasなど、よく使うものは入っています。

<details><summary>クリックで表示</summary><div>

```
Package              Version
-------------------- -----------
anyio                3.6.2
argon2-cffi          21.3.0
argon2-cffi-bindings 21.2.0
attrs                22.1.0
autovizwidget        0.20.0
aws-glue-sessions    0.37.0
awscli               1.27.10
Babel                2.11.0
backcall             0.2.0
beautifulsoup4       4.11.1
bleach               5.0.1
boto3                1.26.10
botocore             1.29.10
certifi              2022.9.24
cffi                 1.15.1
charset-normalizer   2.1.1
click                8.1.3
colorama             0.4.4
debugpy              1.6.3
decorator            5.1.1
defusedxml           0.7.1
docutils             0.16
entrypoints          0.4
fastjsonschema       2.16.2
hdijupyterutils      0.20.0
idna                 3.4
importlib-metadata   5.0.0
importlib-resources  5.10.0
ipykernel            6.16.2
ipython              7.34.0
ipython-genutils     0.2.0
ipywidgets           8.0.2
jedi                 0.18.1
Jinja2               3.1.2
jmespath             1.0.1
json5                0.9.10
jsonschema           4.17.0
jupyter              1.0.0
jupyter-client       7.4.7
jupyter-console      6.4.4
jupyter-core         4.11.2
jupyter-server       1.23.2
jupyterlab           3.5.0
jupyterlab-pygments  0.2.2
jupyterlab-server    2.16.3
jupyterlab-widgets   3.0.3
MarkupSafe           2.1.1
matplotlib-inline    0.1.6
mistune              2.0.4
mock                 4.0.3
nbclassic            0.4.8
nbclient             0.7.0
nbconvert            7.2.5
nbformat             5.7.0
nest-asyncio         1.5.6
nose                 1.3.7
notebook             6.5.2
notebook-shim        0.2.2
numpy                1.21.6
packaging            21.3
pandas               1.3.5
pandocfilters        1.5.0
parso                0.8.3
pexpect              4.8.0
pickleshare          0.7.5
pip                  20.2.2
pkgutil-resolve-name 1.3.10
plotly               5.11.0
prometheus-client    0.15.0
prompt-toolkit       3.0.32
psutil               5.9.4
ptyprocess           0.7.0
pyasn1               0.4.8
pycparser            2.21
Pygments             2.13.0
pykerberos           1.2.4
pyparsing            3.0.9
pyrsistent           0.19.2
python-dateutil      2.8.2
pytz                 2022.6
PyYAML               5.4.1
pyzmq                24.0.1
qtconsole            5.4.0
QtPy                 2.3.0
requests             2.28.1
rsa                  4.7.2
s3transfer           0.6.0
Send2Trash           1.8.0
setuptools           49.1.3
six                  1.16.0
sniffio              1.3.0
soupsieve            2.3.2.post1
tenacity             8.1.0
terminado            0.17.0
tinycss2             1.2.1
tomli                2.0.1
tornado              6.2
traitlets            5.5.0
typing-extensions    4.4.0
urllib3              1.26.12
wcwidth              0.2.5
webencodings         0.5.1
websocket-client     1.4.2
widgetsnbextension   4.0.3
zipp                 3.10.0
```

</div></details>

# 入っていないモジュール

追加する必要があります。`pip install`ではなく、マジックで追加します。

# モジュールの追加の仕方

サンプルは以下のようになります。複数入れる場合はカンマで区切ります。

``` python
# 読み込ますモジュール
%additional_python_modules awswrangler,pdfminer.six
```
これを記載すると、Job parametersに追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2ab53e8c-4c9b-0174-d0c2-40751924e619.png)

またこの情報、コード管理と連携するとそこに記載されます。

```json
{
  "defaultArguments" : {
    "--encryption-type" : "sse-s3",
    "--enable-job-insights" : "false",
    "--additional-python-modules" : "awswrangler,pdfminer.six",
    "--enable-glue-datacatalog" : "true",
    "library-set" : "analytics",
    "--job-language" : "python",
    "--TempDir" : "s3://aws-glue-assets-123456789012-ap-northeast-1/temporary/"
  },
```

一方ダウンロードしたJSONファイルの中には、この情報の記載はありませんでした。

## インタラクティブセッションで使う

インタラクティブセッションでは以下のようなメッセージが出てきます。

```
You are already connected to session <SESSION ID>. Your change will not reflect in the current session, but it will affect future new sessions. 
```

インポートすると以下のようにエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f3e4669a-0a4a-0201-26d5-d250ffe52d8b.png)

その際はセッションを止め、後続処理を動かすだけでOKです。
``` python
%stop_session
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8d7ce2f7-39a6-559c-ec30-fa7e9651b878.png)


```python
# 動かすだけで、セッション開始してくれる
import awswrangler as wr
```
モジュールを引数に指定して起動されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6e1b44ba-2bca-dab3-dd40-cfde3c0d6313.png)

# おわりに

Jupyter NotebookのGlueでのモジュールのインポートについてまとめてみました。

これだけ便利になってきたので、Lambdaで出来なかったことをGlueなら実現できそうです。