目次
はじめに
こんにちは、omkです。
最近しばらくずっとGlueを触っていますが、Excelのxlsxファイルをデータフレームに取り込む必要があったので検証してみました。
変換してみた
以下のコードで変換できることを確認しました。
Glue3.0で実行します。
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from pyspark.sql.types import *
from awsglue.context import GlueContext
from awsglue.job import Job
import pandas as pd
args = getResolvedOptions(sys.argv, ['JOB_NAME', 'FILEPATH', 'OUTPUT'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
pandasdf = pd.read_excel(args['FILEPATH'])
schema_StructType = StructType([
StructField('column1', StringType(), True),
StructField('column2', StringType(), True),
StructField('column3', StringType(), True),
])
sparkdf = spark.createDataFrame(pandasdf,schema=schema_StructType)
sparkdf.write.mode("overwrite").parquet(args['OUTPUT'])
job.commit()
では解説します。
import pandas as pd
###
pandasdf = pd.read_excel(args['FILEPATH'])
Excelのファイルを読み込む方法としてPandasを利用します。
S3にファイルをアップロードしてPandasで読み込み、「Pandas DataFrame」に変換します。
PandasでExcelを読み込むには「openpyxl」を使用する必要があります。
Glueで利用できるモジュールは以下に記載されています(Glue2.0ですが……)
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-python-libraries.html#glue20-modules-provided
openpyxlはこちらに記載がありませんので自分で追加する必要があります。
追加でモジュールを追加するには「--additional-python-modules」を設定します。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-python-libraries.html#addl-python-modules-support
ジョブのパラメータに「--additional-python-modules: openpyxl」を記述します。
これでopenpyxlが利用できるようになりました。
そのままではSparkでデータを扱うことができないのでさらに「Pandas DataFrame」から「Spark DataFrame」に変換します。
このときに値がない列が存在する場合、型推定が上手くできずにエラーとなりますのでschemeを定義します。
from pyspark.sql.types import *
###
schema_StructType = StructType([
StructField('column1', StringType(), True),
StructField('column2', StringType(), True),
StructField('column3', StringType(), True),
])
これを合わせてSpark DataFrameに変換します。
sparkdf = spark.createDataFrame(pandasdf,schema=schema_StructType)
以上でExcelファイルのデータをSparkで扱えるようになりました。
おわりに
変換対象のデータ形式の要件は複雑ではありますが、Excelだから使えないということはないみたいです。
以上、最後までお付き合いありがとうございました。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!