AWS-Glue

AWS GlueでExcelファイルをSparkDataFrameに変換してみた

はじめに

こんにちは、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だから使えないということはないみたいです。
以上、最後までお付き合いありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA