AWS Glue Custom Visual Transformsで独自の変換処理を作ってみた

事前に変換処理を定義して他のGlueジョブでも使いまわせる優れもの
2023.01.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。

先月2022年12月に開催されたre:Invent期間中にAWS Glue Custom Visual Transformsのアップデートがアナウンスされました。

本エントリでは実際にAWS Glue Custom Visual Transformsを使ってみた様子をお届けします。

AWS Glue Custom Visual Transformsとは

うれしいところ

AWS Glue Custom Visual TransformsはGlue Studioのビジュアルエディタで独自の変換を定義でき、他のジョブにも再利用可能な機能です。

コードが書けるメンバーが独自のETLロジックをPythonとJSONで定義し、Custom Visual TransformとしてファイルをS3バケットに置いておくことで、同一AWSアカウント内の別のGlueジョブで再利用可能になります。標準で提供されている変換ノードと同じように使えて、ローコードのETL開発を便利にしてくれる機能です。

必要なもの

Custom Visual Transformsの定義で必要になるのは以下の通り。

  • JSON設定ファイル(.json
  • Pythonファイル(.py
    • JSONファイルと同一の名前を指定

JSONで定義する

まずはCustom Visual Transformsのパラメータ情報や名前などを定義するJSON設定ファイルを作成します。以下のポストで記述されているサンプルを使ってJSONファイルを作成しました。(一部を日本語に変えています)

{
 "name": "salesdata_generator",
 "displayName": "Synthetic Sales Data Generator",
 "description": "Generate synthetic order datasets for testing purposes.",
 "functionName": "salesdata_generator",
 "parameters": [
  {
   "name": "numSamples",
   "displayName": "サンプル数",
   "type": "int",
   "description": "生成するサンプル数"
  },
  {
   "name": "year",
   "displayName": "Year",
   "isOptional": true,
   "type": "int",
   "description": "ランダムに分布するデータを生成する年(デフォルトは昨年)",
   "validationRule": "^\\d{4}$",
   "validationMessage": "Please enter a valid year number"
  }
 ]
}

定義が必要となるフィールドは以下の通り。

フィールド

項目 説明
name Transformの名前。変換処理を定義するPythonファイルと同一名称とする必要がある。文字、アンダースコア、数字が使用可能。(先頭は文字かアンダースコアのみ)
displayName(任意) ビジュアルジョブエディタに表示されるTransform名。指定しない場合、上述のnameが表示される。
description(任意) Glue Studioに表示されるTransformの説明。この説明文で検索が可能。
functionName Pythonで呼び出す関数を特定するためのPython関数名
path(任意) PythonファイルへのS3フルパス。指定しない場合、同じS3ファイル上でJSON設定ファイルと同じ名前の.pyファイルを利用する。
parameters(任意) ビジュアルエディタで利用者が指定可能なパラメータ。パラメータで設定が必要な項目は後述。

パラメータ

項目 説明
name Pythonに渡されるパラメータ名
displayName(任意) ビジュアルジョブエディタに表示される名前
type パラメータのデータ型。strintfloatlistboolから指定。
isOptional パラメータが任意入力かどうかを指定。指定がない場合、必須入力として扱われる。
description(任意) ビジュアルエディタに表示されるパラメータの説明文
validationType(任意) パラメータの検証方法。現在はRegularExpression(正規表現)のみサポート。
validationRule(任意) validationTypeRegularExpressionの場合、正規表現を記載。構文はEcmascriptに準拠する必要がある。
- ECMAScript® 2023 Language Specification
validationMessage(任意) 検証が失敗した時に表示するメッセージ
listOptions Select または Multiselect UI コントロールに表示するオプション。
listType(任意) type = listのオプションの種類をstrintfloatlistboolから定義

Pythonで変換処理を記述する

次に、具体的な変換処理をPythonで記述します。今回は上述したJSONファイルと同様のポストで記載されているPythonをサンプルとして使います。

from awsglue import DynamicFrame
import pyspark.sql.functions as F
import datetime
import time

def salesdata_generator(self, numSamples, year=None):
  if not year:
​    \# Use last year
​    year = datetime.datetime.now().year - 1
  year_start_ts = int(time.mktime((year,1,1,0,0,0,0,0,0)))
  year_end_ts = int(time.mktime((year + 1,1,1,0,0,0,0,0,0)))
  ts_range = year_end_ts - year_start_ts
  departments = ["bargain", "checkout", "food hall", "sports", "menswear", "womenwear", "health and beauty", "home"]
  dep_array = F.array(*[F.lit(x) for x in departments])
  dep_randomizer = (F.round(F.rand() * (len(departments) -1))).cast("int")

  df = self.glue_ctx.sparkSession.range(numSamples) \
   .withColumn("sale_date", F.from_unixtime(F.lit(year_start_ts) + F.rand() * ts_range)) \
   .withColumn("amount_dollars", F.round(F.rand() * 1000, 2)) \
   .withColumn("department", dep_array.getItem(dep_randomizer))  
  return DynamicFrame.fromDF(df, self.glue_ctx, "sales_synthetic_data")

DynamicFrame.salesdata_generator = salesdata_generator

ローカル環境で作成してそのままS3バケットにアップロードしてもいいのですが、AWS Glue StudioにはNotebook機能があります。こちらを使えばマネジメントコンソール上で開発やテストをシームレスに行えます。

S3バケットにファイルを置く

Glueでジョブを実行したことがあれば以下のようなS3バケットが自動的に生成されています。ここにtransformsという名前でフォルダを作り、配下にJSONファイルとPythonファイルを配置します。

s3://aws-glue-assets-<AWSのaccount id>-<リージョン名>/transforms/

JSONファイル内でpathを設定していない場合、Glueは自動的に同一の名前のPythonファイルをペアにします。

AWS Glue Job StudioからCustom Visual Transformsを使う

AWS Glue Studioでビジュアルジョブエディタを開き、Actionから検索すると、作成したTransformが選択できるようになりました。同じAWSアカウント内であれば他のジョブで使いまわすことも可能です。

パラメータとして指定した項目も反映されています。

Transformが表示されない場合はリロードしてみてください。リロードしても表示されない場合は、以下のポイントでJSONファイルの検証に失敗している可能性があります。

  • 必須項目がすべてあるかどうか
  • 有効なJSON形式になっているかどうか
  • 不正確または無効なパラメータ
  • 同じAmazon S3のパスに.py.jsonの両ファイルが存在しているかどうか
  • .py.jsonのファイル名が一致しているかどうか

最後に

一度変換処理を定義しておけば、標準で提供されている変換ノードと同じように選べるAWS Glue Custom Visual Transformを触ってみました。

標準で提供されている変換だと物足りず、かといって独自でSparkを記述するハードルも高い…という課題にピッタリはまる機能だと感じました。作成したTransformは同一AWSアカウント内であれば他のユーザーでも使えるので、ますますAWS Glueでのローコード開発が便利になりそうです。

参考