【AWS】AWS Glue ~ Excelを扱うには / Python shell 版 ~

■ はじめに

AWS Glue の Python shell で、Excelを扱おうとしたが、
はまったので、メモ。

PySpark (Glue 2.0) での Excel の扱いは、以下の関連記事を参照のこと。

AWS Glue ~ Excelを扱うには / PySpark (Glue2.0) 版 ~
https://dk521123.hatenablog.com/entry/2020/10/09/144520

■ 問題内容

前提知識:Python / PandasによるExcelの扱いについて

https://dk521123.hatenablog.com/entry/2019/11/05/221010

で触れたが、「「xlrd / xlwt」が必要」

問題詳細

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/add-job-python.html#python-shell-supported-library

より抜粋
~~~~
Python シェルジョブを実行する環境は、次のライブラリをサポートしています。

pandas (python setuptools 設定である setup.py を使用してインストールする必要があります)
~~~~

っという訳で、「xlrd / xlwt」は入っていないので、
そのまま実装すると、エラーになる(以下の「エラー内容」を参照)

ただ、AWS Glueに、xlrd をインストールする訳にはいかないので、、、

エラー内容

Install xlrd >= 1.0.0 for Excel support

解決案

詳細手順

[1] 以下のサイトからWheelファイルをダウンロードし、S3内に格納しておく
⇒ 今回は、「xlrd-1.2.0-py2.py3-none-any.whl」

https://pypi.org/project/xlrd/

[2] AWS Glue コンソールの [ジョブプロパティ] ページで、
     [Python ライブラリパス] ボックスに[1]の ファイルへのパスを指定する

■ サンプル

Excel => CSV変換

import io
import pandas as pd
import boto3

s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket='bucket-name', Key="sample.xlsx")
data_frame = pd.read_excel(io.BytesIO(response['Body'].read()), encoding='utf-8')

out = io.BytesIO()
data_frame.to_csv(out, index=False)
s3_client.put_object(Bucket='bucket-name', Key="sample.csv", Body=out)

関連記事

AWS Glue ~ Excelを扱うには / PySpark (Glue2.0) 版 ~
https://dk521123.hatenablog.com/entry/2020/10/09/144520
AWS Glue のトラブルシューティング
https://dk521123.hatenablog.com/entry/2019/10/25/232155
AWS Glue ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/01/221926
パッケージ管理 ~ wheel / egg ~
https://dk521123.hatenablog.com/entry/2019/11/09/001342
PythonExcel を扱うには
https://dk521123.hatenablog.com/entry/2019/11/05/221010
Amazon S3Python boto3でS3を操作する ~
https://dk521123.hatenablog.com/entry/2019/10/21/230004