前提(長くて説明下手です)
ETL処理をGlue jobを用いて、自動化しようとしたときに
import pandas
from pandas.io.json import json_normalize
df = pandas.json_normalize()
#~ 中略 ~
というように処理をGlueスクリプトに書いていたが、jobを実行してみるとエラーログには何も書かれておらず、module 'pandas' has no attribute 'json_normalize'というログのみ書かれていた。
またjobのstatusは、「Succeeded」になっているが、肝心のcsvファイルはs3にアップロードされていない。
この時初めて知ったのだが、json_normalizeはpandasのversion >= '1.0.0'で実装されており、Glueでのpandasのversionを確認したところ、0.~であり、1.0.0より前のversionだった。
Glue スクリプトでは、pipを叩くことはできないので、外部モジュールとして「pandas >= 1.0.0」を取り入れる必要がある。
ここまでが前提のお話
目次
#setupスクリプトについて
setup.pyファイルについて
from setuptools import setup
NAME = 'test_wheel'
DESCRIPTION = 'for test'
REQUIRES_PYTHON = '~=3.6.0'
VERSION = '0.0.0'
REQUIRED = [#特別に必要なモジュールをversion指定でimportするため
'pandas >= 1.1.0',
]
setup(
name=NAME,#パッケージ名
version=VERSION,
#install_requires=["packageA", "packageB"],
python_requires = REQUIRES_PYTHON,
#extras_require={}
#entry_points={}
)
今回はNAME,DESCRIPTION,REQUIRES_PYTHON,VERSION,REQUIREDでsetup内の引数を指定した。
ほかにも引数は多くあるみたいだけれど、今回は使わないので説明はしないです。
気になる方は、
setupスクリプトを書く
を参照していただけたらなと思います。
#wheelファイルの作成
setup.pyから.whlファイルの作成
先程、setup.pyファイルを作成したので、次にwheelファイルを作成します
$ python3 setup.py bdist_wheel
上記をターミナルで実行すると、以下のディレクトリ構造の形でファイルが生成されます
.
├── setup.py
├── build
│ └── build~
├── dist
│ └── {NAME}.whl
└── {NAME}.egg-info
└── 5つくらいのファイル(今回は省略)
今回使うのは、distフォルダの
{NAME}.whl
になります
#ライブラリパスの通し方
先程、wheelファイルを作成しましたが、これをどうGlue jobに適用するの?という話をします
1.S3にwheelファイルをアップロードする
2.Glue job詳細のPythonライブラリパスの部分にwheelファイルのS3 URIを貼り付ける
上記の2点を行った後にGlueスクリプトを実行すれば良い。