GUIでETL処理を構築するAWS Glue Studioのハンズオンをやってみた

ぐるぐるぐるぐるグルコサミン
2020.09.30

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

2020年9月23日にリリースされたAWS Glue Studioでは、GUIベースでETLを構築、ジョブの実行や監視を実施可能です。

この新機能を体験できるハンズオンが費用も1ドルほど、45分程度の時間でできるとのことでしたので挑戦してみました。本エントリは以下手順に沿ってハンズオンを進めていきます。

ハンズオンのゴール

ハンズオン資料からの引用です。

AWS Glue Studioを使用してETLジョブを作成する方法を示すために、トロントの駐車違反切符データセット、具体的には2018年にトロント市で発行された駐車違反切符に関するデータと、それらの駐車券に関連する裁判の情報を含むデータセットを使用します。このハンズオンのゴールは、2つのデータセットをフィルタリング、結合、および集計して、2018年にトロント市の裁判所ごとに処理された駐車違反切符の数を取得することです。

使用するデータセットは以下の通り。

なお、本ハンズオンではus-east-1リージョンを使用します。ハンズオン手順「Launch Stack」よりus-east-1に必要なリソースを作成するCloudFormationスタックを実行したらハンズオンを進める準備は完了です。

ジョブの作成

AWSマネジメントコンソールよりAWS Glue→AWS Glue Studioを選択します。「Create and manage jobs」よりETLジョブの作成が可能です。メニューに従ってデータソースやアウトプット先を指定する「Source and target added to the graph」とまっさらな状態からETLを構築する「Blank graph」がありますが、今回のハンズオンでは「Blank graph」を使用します。

ジョブの名称をUntitled Jobから任意のもの(今回のハンズオンではYYZ-Tickets-Job)に変更します。

データソースの追加

AWS GlueテーブルのTicket(違反切符のデータ)、Trials(裁判のデータ)をデータソースとしてジョブに追加します。これらのデータはS3上にParquet形式で配置されています。

「+」ボタンから処理を表す単位であるノードを追加後、右ペインNode propatiesタブにTicketsと入力し、Node TypeにS3を指定します。

Data Source propaties-S3タブに移動し、Databaseに「yyz-tickets」、Tableに「tickets」を指定します。

同じ要領でTrialsのデータソースも追加します。先ほど作成したTicketsを選択したままにならないよう、画面の空白部分をクリックするなどしてから「+」ボタンを押しましょう。選択されたままの場合、Ticketsの配下に新たなノードが作成されてしまいます。

変換処理の追加

追加した2つのデータソースに対して変換のコンポーネントを追加し、データ型の変更・不要な列の削除・結合処理を実施します。

まずはTicketsから。ノードを選択して「+」ボタンを選択し、配下に変換処理のためのノードを追加します。Nameには任意の名前(今回は「Ticket_Mapping」)を、Node typeには「Apply Mapping」を指定します。Node parentsにはTicketsが選択されていることを確認してください。

Transformタブからデータ型の変更・不要列の削除を行います。ticket_numberのデータ型をDecimal型からint型に変更し、location1location4provinceをDropのチェックボックスにチェックをしてフィルタします。

同じ要領でTrialsにも変換処理のノードを追加します。parking_ticket_numberをLong型からint型に変更します。

ここまでできたらお待ちかねの結合処理です。Ticket_Mappingを選択した状態で「+」ボタンからノードを追加し、Nameに「Join_Ticket_Trial」と入力します。Node TypeにはJoinを指定し、結合させたい「Ticket_Mapping」と「Trial_Mapping」の2つのノードをNode Parentsに追加します。

Transformタブに移動し、結合の方法を指定します。今回はInner Joinを選択し、前項でデータ型を合わせたticket_numberparking_ticket_numberをキーとして結合させるよう設定します。

スクリプトを記述してデータ集計

GUI操作のみで行うことが難しい複雑な変換処理が必要な場合、コードを記述することで対応可能です。このステップでは、裁判所ごとの違反切符の数をPySparkを記述することで実現します。

前項で結合処理を行った「Join_Ticket_Trial」ノードを選択して新たなノードを生成し、「Aggregate_Tickets」と名付けます。Node TypeにはCustom transformを指定します。

Transformタブに移動し、コードブロックのfunction名をAggregate_Ticketsに変更して以下コードをコピーアンドペーストします。

selected = dfc.select(list(dfc.keys())[0]).toDF()
selected.createOrReplaceTempView("ticketcount")
totals = spark.sql("select court_location as location, infraction_description as infraction, count(infraction_code) as total  FROM ticketcount group by infraction_description, infraction_code, court_location order by court_location asc")
results = DynamicFrame.fromDF(totals, glueContext, "results")
return DynamicFrameCollection({"results": results}, glueContext)

加工したデータをS3バケットに保存

今回はS3バケットに加工したデータを保存させます。ノードを追加して任意の名前(Select_Aggregated_Data)を入力し、Node TypeにSelectFromCollectionを選択します。

さらにノードを追加します。Node propatiesタブでは任意の名前「Ticket_Count_Dest」を入力し、Node typeにはData targetセクションのS3を指定します。Data source(入力)セクションではないところにご注意を。

Data target propaties-S3タブにはフォーマットや圧縮タイプを指定し、データを出力する場所を指定します。今回のハンズオンではParquet形式でGZIPで圧縮されるように設定しました。出力先に指定するtarget locationは以下の通り。

s3://glue-studio-blog-*{12桁のアカウントID}*/parking_tickets_count/

これでETL処理の構築は完了です!仕上がりは以下のような見た目になります。

ジョブの実行

構築したETL処理を実際に実行していきましょう。Job detailsタブから実行のためのパラメータを入力できます。ジョブの名前と説明を入力し、IAM RoleにはAWSGlueStudioRoleを指定します。

Job Bookmarkは常にデータセット全体を処理するDisableにします。Number of retriesには1を入力します。ここまで設定できたらSaveしてRunボタンから実行開始します。

Monitor jobs runsをクリックすると、ジョブの稼働状況がダッシュボード形式で確認可能です。

画面下部のJob Runs Breakdownで実行したジョブのステータスが確認できます。ステータスがSucceededになるまで待ちましょう。

出力データの確認

加工したデータはAmazon Athenaを使って確認可能です。データベースにyyz-ticktesを、テーブルにparking_tickets_countを指定してクエリを実行すると、このハンズオンのゴールである2018年にトロント市の裁判所ごとに処理された駐車違反切符の数が確認できました。

最後に

AWS Glue Studioを使用してGUIでETL処理を構築するハンズオンのご紹介でした。

GUIのいいところは誰でも直感的に操作ができるところで、ハンズオンも次に何をすればいいのかなんとなく予想しながらスムーズに進めることができました。コードの記述無しでSaaSアプリケーションとAWSサービスを連携させるAmazon AppFlowと組み合わせれば、全てGUIベースで手早くデータ分析環境が整えられそうです。