Glueでの開発を行う場合、開発エンドポイントを利用することが一般的かと思いますが、ローカルでも動作確認できるのでメモします

dockerイメージの取得と起動

dockerコマンドを用いた起動例を下記に示します

# glue3.0のライブラリを含むイメージのダンロードdocker pull amazon/aws-glue-libs:glue_libs_3.0.0_image_01# 起動# ローカルで設定したAWSの権限をそのまま渡すdocker run -it -p 8888:8888 -p 4040:4040 -e DISABLE_SSL="true" -e AWS_PROFILE=default -v ~/.aws:/home/glue_user/.aws --name glue_jupyter3 amazon/aws-glue-libs:glue_libs_3.0.0_image_01 /home/glue_user/jupyter/jupyter_start.sh

起動した状態で、 https://localhost:8888 にアクセスして、jupyter labの画面が表示されれば成功です

docker composeを使った起動

またs3やdynamodbなどローカルで同時期どうしたい場合は、 docker compose を使うこともあるかと思います

そこで、docker-compose.yamlの例を下記に示します

version: '3.8'services:  glue_jupyter:    image: amazon/aws-glue-libs:glue_libs_3.0.0_image_01    container_name: glue_jupyter    environment:      DISABLE_SSL: true      AWS_PROFILE: default    volumes:      - ~/.aws:/home/glue_user/.aws:ro      - ./jupyter_workspace:/home/glue_user/workspace/jupyter_workspace    ports:      - 8888:8888      - 4040:4040    command: /home/glue_user/jupyter/jupyter_start.sh

DynamicFrameの基本的な操作

glueではjsonなどスキーマが定まっていないデータに対して、カラムの方を推測するDynamicFrameというものが存在します https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-dynamic-frame.html

そこでS3からjsonを取ってきて、DynamicFrameで操作するサンプルを下記に示します

# 必要なライブラリのインポートfrom pyspark import SparkContextfrom awsglue.context import GlueContext# コンテキストの初期化glueContext = GlueContext(SparkContext.getOrCreate()) # s3からデータを取得し、ダイナミックフレームの生成persons = glueContext.create_dynamic_frame_from_options(connection_type = "s3", connection_options = {"paths": ["s3://awsglue-datasets/examples/us-legislators/all/persons.json"]}, format = "json")

ダイナミックフレームの操作

ダイナミックフレームはGlueで独自に定義されているデータ構造で、pandas等で利用されるDataFrameとは異なり、スキーマを推定してくれるという特徴を持っています

細かい挙動に関してはこちらを参照

https://dev.classmethod.jp/articles/aws-glue-dynamicframe/

# ダイナミックフレーム周りの情報## データフレームに変換し出力persons.toDF().show()## データ件数persons.count()## スキーマの表示persons.printSchema()# フィールドの表示persons.select_fields('name')# 変換## フィールドの削除persons.drop_fields('image')persons.drop_fields(['image', 'gender']) # 複数の場合は配列を渡す# フィールド名の変換persons.rename_field('id', 'person_id')

pythonスクリプトの実行

実際にGlueではpythonスクリプトを実行することになるかと思うんですが、下記のコマンドを利用することによって、ローカルでもスクリプトの実行が可能になります

# pythonスクリプトのローカル実行# モジュールとして common.py, 環境変数としてdevを定義し、etl.pyのスクリプトを実行docker compose run --rm glue_jupyter /home/glue_user/spark/bin/spark-submit --py-files common.py etl.py --env dev

参考文献