AWS Glue 実践入門:サービスメニュー内で展開されている「ガイド付きチュートリアル」を試してみた
AWS Glueには、公式ドキュメントによる解説の他にも管理コンソールのメニューから展開されている「チュートリアル」が存在します。まずは実際に動かしてみよう!という形でガイドも丁寧に用意されており、とても分かり易い内容となっていました。当エントリではその内容について実際に動かしてみたものを、順を追って見ていきたいと思います。
目次
AWS Glueメニューから利用可能な「チュートリアル」
AWS Glueの「get started」(入門)ページは以下のURLからアクセスする事が出来ます。(N.Virginiaの場合) 中央の「Get Started」ボタンを押下して機能画面へと遷移。
遷移後の左メニューの一番下に「Tutorials」という項があり、この配下に幾つかのパートに分かれる形でチュートリアルが展開されています。「S3上にアップロードされているCSVファイルをParquet形式に変換」するというユースケースをAWS Glueを使って実現する...という内容となっています。以降こちらの各種チュートリアルを実践する形で進めて行きます。
(※上記の様に、リンクを選択していくと作業ガイドが適宜出る形で チュートリアルを進める事が出来ます。)
AWS Glueチュートリアル実践
クローラの作成
クローラ情報の作成
まず初めに行うのは「クローラの追加」から。クローラは全ての種類のリポジトリのデータをスキャン・分類し、スキーマ情報を抽出、メタ−データを自動的にAWS Glueデータカタログに格納する機能を有します。
チュートリアルの「Add crawler」リンクからクローラ一覧へ遷移し、[Add Crawler]ボタンを押下。
クローラ名とクローラ実行の際に用いるIAM roleの設定を行います。名前については任意のクローラ名を設定、IAM Roleについては前段準備段階で作成していたIAM Roleを指定し[Next]を押下。
データストアの指定
データストアの指定。ここではAmazon S3上に存在するCSVファイルを指定します。チュートリアル用に用意されているファイル群がs3://crawler-public-us-east-1/flight/2016/csvにあるとの事なのでここではそのデータを使う事にします。配下のファイルを全て処理対象としたかったので末尾に/を付与し、s3://crawler-public-us-east-1/flight/2016/csv/と指定しました。指定後[Next]を押下。
ちなみに配下にはどんな形でデータが入っているかというと、こんな感じ。月毎にフォルダを切った形となっています。
$ aws s3 ls s3://crawler-public-us-east-1/flight/2016/csv/ --recursive --human-readable --summarize 2017-07-07 xx:xx:25 0 Bytes flight/2016/csv/ 2017-07-08 xx:xx:15 113.7 MiB flight/2016/csv/mon=1/January2016.csv 2017-07-08 xx:xx:16 80.2 MiB flight/2016/csv/mon=10/October2016.csv 2017-07-08 xx:xx:17 62.6 MiB flight/2016/csv/mon=11/November2016.csv 2017-07-08 xx:xx:17 118.8 MiB flight/2016/csv/mon=12/December2016.csv 2017-07-08 xx:xx:18 108.2 MiB flight/2016/csv/mon=2/February2016.csv 2017-07-08 xx:xx:19 122.5 MiB flight/2016/csv/mon=3/March2016.csv 2017-07-08 xx:xx:20 117.9 MiB flight/2016/csv/mon=4/April2016.csv 2017-07-08 xx:xx:21 122.5 MiB flight/2016/csv/mon=5/May2016.csv 2017-07-08 xx:xx:23 124.7 MiB flight/2016/csv/mon=6/June2016.csv 2017-07-08 xx:xx:24 128.5 MiB flight/2016/csv/mon=7/July2016.csv 2017-07-08 xx:xx:25 127.4 MiB flight/2016/csv/mon=8/August2016.csv 2017-07-08 xx:xx:26 116.3 MiB flight/2016/csv/mon=9/September2016.csv Total Objects: 13 Total Size: 1.3 GiB
また、S3パスについては作成済みのパスをUIで指定する事も可能です。
データストアは複数指定する事も可能です。ここでは上記指定のものだけで良いので[Next]押下で先に進みます。
クローラのスケジュール設定
ここではクローラをどの頻度で動かすか、そのサイクルを指定します。今回はデフォルト指定の「Run on demand」のままで先に進みます。[Next]押下。
サイクルは以下の様に細かく指定する事が可能です。データ生成のタイミングに合わせて適切な指定を行いましょう。
クローラ出力先の指定
クローラが集めた情報を格納するための任意のデータベースを指定または作成します。既存作成済のものを指定する事も可能ですが、ここは新しく作成してみる事にします。[Add database]を押下。
データベース名と説明を記入し、[Create]押下。
その他選択項目はありますがここはデフォルト指定のままで[Next]押下、次へ進みます。
プレビュー画面にて内容を確認、[Finish]を押下。
クローラの実行
クローラが作成されました。この時点ではクローラは稼働しておらず、ステータスも「Ready」の状態となっています。
クローラは任意のものを選択して[Run Crawler]で実行出来ます。
クローラ実行。処理が開始され、幾らかの処理時間を要した後、停止のステータスに移行しました。
停止ステータス後、ステータスは[Ready]に戻り、ログファイルが確認出来るようになりました。このリンクをクリックしてみます。
CloudWatchのログ出力に連携しており、実行内容を以下の形で確認出来ました。
2017-09-19 No older events found for the selected filter. clear filter. 15:57:12 [eff22c13-f3e2-4c64-9c48-057a9ebee061] BENCHMARK : Running Start Crawl for Crawler CM-Flights_Data_Crawler 15:57:24 [eff22c13-f3e2-4c64-9c48-057a9ebee061] BENCHMARK : Classification complete, writing results to database cm-flights-db 15:57:27 [eff22c13-f3e2-4c64-9c48-057a9ebee061] INFO : Created table csv in database cm-flights-db 15:57:28 [eff22c13-f3e2-4c64-9c48-057a9ebee061] INFO : Created partitions with values [[1], [10], [11], [12], [2], [3], [4], [5], [6], [7], [8], [9]] for table csv in database cm-flights-db 15:57:28 [eff22c13-f3e2-4c64-9c48-057a9ebee061] BENCHMARK : Finished writing to Catalog 15:58:36 [eff22c13-f3e2-4c64-9c48-057a9ebee061] BENCHMARK : Crawler has finished running and is in state READY
また、クローラを実行した事により、指定したデータベースも合わせて作成を確認出来ました。
テーブルの探索
テーブル一覧の表示と対象テーブルの検索
上記手順で作成したクローラ情報のデータベースについて、その内容を見ていきたいと思います。[Tables]にはAWS Glueのクローラが収集した情報がテーブルとしてデータカタログ内に格納されています。作成したデータベースを指定して、
[View Details]を選択。
テーブルの詳細情報を確認
クローラが収集したテーブル情報の詳細を確認出来る画面に遷移します。様々な情報を確認する事が出来ますが、ここでは画面右上にある[View patitions]を選択。
先程指定したS3データソースのフォルダ(パーティション)毎の情報が一覧として表示されました。[View files]をクリックすると該当のS3バケット&フォルダが表示され、[View properties]をクリックすると、
以下の様な形でパーティション情報を確認出来ます。
スキーマ情報の編集
収集したスキーマ情報は編集する事も可能です。画面右上の[Edit Schema]ボタンを押下すると、
スキーマ情報の一覧が表示されます。データ型の部分はリンク表示となっていて変更が可能となっていますので試しに変更してみましょう。一番上の項目「Year」のデータ型はbigint型となっていますが、このリンクをクリックして、
SMALLINT型に変更してみます。
変更できました。
バージョンの比較
上記手順で取得したテーブル情報の一部を変更しました。AWS Glueでは、こういった情報の「変更履歴」を管理しているのでバージョン毎の比較を行う事も可能です。[Compare versions]ボタンをクリックすると、
以下の様な形で指定2バージョンの相違を確認出来ます。これを使う事で該当のテーブルがどのような過程を経て変更され、今に至るのかという部分を把握する事が出来ます。
ジョブの追加と実行
ジョブ基本構成の設定
そしていよいよジョブの実行です。[Add job]を選択するとジョブ一覧の画面に遷移しますので[Add job]ボタンを押下。
ジョブ実行に必要な諸々の設定を行います。基本設定項目は以下の通り。
- Name:
- ジョブ名称。任意の値を設定。
- IAM Role:
- ジョブ実行に用いるIAM Roleを作成済みのものから選択。
- This job runs:
- 実行に際して用いる方法。ここでは「AWS Glueにより生成されたスクリプトを利用」する方法を選択しました。
- Script file name:
- スクリプトファイル名。
- S3 path where the script is stored:
- スクリプトファイルが格納されるS3のパスを指定。
- Temporary directory:
- 出力結果を格納するS3パスを指定。
その他、設定可能な項目は以下の様なものがあります。今回のチュートリアルでは使わないので言及はしませんが、別途機会を設けて後続のエントリで触れてみたいと思います。
入力データソースの指定
処理の入力情報として用いるデータソースを指定します。前述の作業で作ったCSVのものを選択。
出力データソースの指定
次いで処理の出力情報とするデータソースを指定します。既存のデータソースを指定する方法と新規にデータソースを作成する2つの方法が選択可能です。ここでは新規作成の方法で進めたいと思います。
一覧情報が表示されている状態で画面上部のラジオボタンのうち「Create tables in your data target」を選択。すると以下の様に所定の設定情報を選べるようになります。ここでは「データストアにAmazon S3」を選択し、「ファイルのフォーマットはParquet形式」で任意のS3パスに出力するようにしてみます。
入力元(ソース)&出力先(ターゲット)のカラムマッピング指定
入力元(ソース)&出力先(ターゲット)のそれぞれのデータにおける項目の有無及び順序に関する指定を行います。ここでは末尾の項目3つを出力時に除去するケースを想定、その仕様に合うような設定をしてみます。
除去を行いたいカラムの行末にある[x]印をクリック。すると、
以下の様に指定・選択した行が削除されました。
この手順を繰り返し、末尾3つの項目を除去しました。[Next]押下。
プレビューで設定内容を確認後、[Finish]を押下。一連のジョブ情報がこれで作成されます。
スクリプト生成及びダイアグラムの表示
上記作業を行うと、程無くして以下の様な画面に遷移します。AWS Glueが上記情報に基いてスクリプトを自動生成し、またスクリプトのグラフィカルな図も表示されています。
画面中央のtipsダイアログを閉じるとこのような形となります。
生成されたソースコードを下記に書き出してみました。
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job ## @params: [JOB_NAME] args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) ## @type: DataSource ## @args: [database = "cm-flights-db", table_name = "csv", transformation_ctx = "datasource0"] ## @return: datasource0 ## @inputs: [] datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "cm-flights-db", table_name = "csv", transformation_ctx = "datasource0") ## @type: ApplyMapping ## @args: [mapping = [("year", "short", "year", "short"), ("quarter", "long", "quarter", "long"), ("month", "long", "month", "long"), ("day_of_month", "long", "day_of_month", "long"), ("day_of_week", "long", "day_of_week", "long"), ("fl_date", "string", "fl_date", "string"), ("unique_carrier", "string", "unique_carrier", "string"), ("airline_id", "long", "airline_id", "long"), ("carrier", "string", "carrier", "string"), ("tail_num", "string", "tail_num", "string"), ("fl_num", "long", "fl_num", "long"), ("origin_airport_id", "long", "origin_airport_id", "long"), ("origin_airport_seq_id", "long", "origin_airport_seq_id", "long"), ("origin_city_market_id", "long", "origin_city_market_id", "long"), ("origin", "string", "origin", "string"), ("origin_city_name", "string", "origin_city_name", "string"), ("origin_state_abr", "string", "origin_state_abr", "string"), ("origin_state_fips", "long", "origin_state_fips", "long"), ("origin_state_nm", "string", "origin_state_nm", "string"), ("origin_wac", "long", "origin_wac", "long"), ("dest_airport_id", "long", "dest_airport_id", "long"), ("dest_airport_seq_id", "long", "dest_airport_seq_id", "long"), ("dest_city_market_id", "long", "dest_city_market_id", "long"), ("dest", "string", "dest", "string"), ("dest_city_name", "string", "dest_city_name", "string"), ("dest_state_abr", "string", "dest_state_abr", "string"), ("dest_state_fips", "long", "dest_state_fips", "long"), ("dest_state_nm", "string", "dest_state_nm", "string"), ("dest_wac", "long", "dest_wac", "long"), ("crs_dep_time", "long", "crs_dep_time", "long"), ("dep_time", "long", "dep_time", "long"), ("dep_delay", "long", "dep_delay", "long"), ("dep_delay_new", "long", "dep_delay_new", "long"), ("dep_del15", "long", "dep_del15", "long"), ("dep_delay_group", "long", "dep_delay_group", "long"), ("dep_time_blk", "string", "dep_time_blk", "string"), ("taxi_out", "long", "taxi_out", "long"), ("wheels_off", "long", "wheels_off", "long"), ("wheels_on", "long", "wheels_on", "long"), ("taxi_in", "long", "taxi_in", "long"), ("crs_arr_time", "long", "crs_arr_time", "long"), ("arr_time", "long", "arr_time", "long"), ("arr_delay", "long", "arr_delay", "long"), ("arr_delay_new", "long", "arr_delay_new", "long"), ("arr_del15", "long", "arr_del15", "long"), ("arr_delay_group", "long", "arr_delay_group", "long"), ("arr_time_blk", "string", "arr_time_blk", "string"), ("cancelled", "long", "cancelled", "long"), ("cancellation_code", "string", "cancellation_code", "string"), ("diverted", "long", "diverted", "long"), ("crs_elapsed_time", "long", "crs_elapsed_time", "long"), ("actual_elapsed_time", "long", "actual_elapsed_time", "long"), ("air_time", "long", "air_time", "long"), ("flights", "long", "flights", "long"), ("distance", "long", "distance", "long"), ("distance_group", "long", "distance_group", "long"), ("carrier_delay", "long", "carrier_delay", "long"), ("weather_delay", "long", "weather_delay", "long"), ("nas_delay", "long", "nas_delay", "long"), ("security_delay", "long", "security_delay", "long"), ("late_aircraft_delay", "long", "late_aircraft_delay", "long")], transformation_ctx = "applymapping1"] ## @return: applymapping1 ## @inputs: [frame = datasource0] applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [("year", "short", "year", "short"), ("quarter", "long", "quarter", "long"), ("month", "long", "month", "long"), ("day_of_month", "long", "day_of_month", "long"), ("day_of_week", "long", "day_of_week", "long"), ("fl_date", "string", "fl_date", "string"), ("unique_carrier", "string", "unique_carrier", "string"), ("airline_id", "long", "airline_id", "long"), ("carrier", "string", "carrier", "string"), ("tail_num", "string", "tail_num", "string"), ("fl_num", "long", "fl_num", "long"), ("origin_airport_id", "long", "origin_airport_id", "long"), ("origin_airport_seq_id", "long", "origin_airport_seq_id", "long"), ("origin_city_market_id", "long", "origin_city_market_id", "long"), ("origin", "string", "origin", "string"), ("origin_city_name", "string", "origin_city_name", "string"), ("origin_state_abr", "string", "origin_state_abr", "string"), ("origin_state_fips", "long", "origin_state_fips", "long"), ("origin_state_nm", "string", "origin_state_nm", "string"), ("origin_wac", "long", "origin_wac", "long"), ("dest_airport_id", "long", "dest_airport_id", "long"), ("dest_airport_seq_id", "long", "dest_airport_seq_id", "long"), ("dest_city_market_id", "long", "dest_city_market_id", "long"), ("dest", "string", "dest", "string"), ("dest_city_name", "string", "dest_city_name", "string"), ("dest_state_abr", "string", "dest_state_abr", "string"), ("dest_state_fips", "long", "dest_state_fips", "long"), ("dest_state_nm", "string", "dest_state_nm", "string"), ("dest_wac", "long", "dest_wac", "long"), ("crs_dep_time", "long", "crs_dep_time", "long"), ("dep_time", "long", "dep_time", "long"), ("dep_delay", "long", "dep_delay", "long"), ("dep_delay_new", "long", "dep_delay_new", "long"), ("dep_del15", "long", "dep_del15", "long"), ("dep_delay_group", "long", "dep_delay_group", "long"), ("dep_time_blk", "string", "dep_time_blk", "string"), ("taxi_out", "long", "taxi_out", "long"), ("wheels_off", "long", "wheels_off", "long"), ("wheels_on", "long", "wheels_on", "long"), ("taxi_in", "long", "taxi_in", "long"), ("crs_arr_time", "long", "crs_arr_time", "long"), ("arr_time", "long", "arr_time", "long"), ("arr_delay", "long", "arr_delay", "long"), ("arr_delay_new", "long", "arr_delay_new", "long"), ("arr_del15", "long", "arr_del15", "long"), ("arr_delay_group", "long", "arr_delay_group", "long"), ("arr_time_blk", "string", "arr_time_blk", "string"), ("cancelled", "long", "cancelled", "long"), ("cancellation_code", "string", "cancellation_code", "string"), ("diverted", "long", "diverted", "long"), ("crs_elapsed_time", "long", "crs_elapsed_time", "long"), ("actual_elapsed_time", "long", "actual_elapsed_time", "long"), ("air_time", "long", "air_time", "long"), ("flights", "long", "flights", "long"), ("distance", "long", "distance", "long"), ("distance_group", "long", "distance_group", "long"), ("carrier_delay", "long", "carrier_delay", "long"), ("weather_delay", "long", "weather_delay", "long"), ("nas_delay", "long", "nas_delay", "long"), ("security_delay", "long", "security_delay", "long"), ("late_aircraft_delay", "long", "late_aircraft_delay", "long")], transformation_ctx = "applymapping1") ## @type: ResolveChoice ## @args: [choice = "make_struct", transformation_ctx = "resolvechoice2"] ## @return: resolvechoice2 ## @inputs: [frame = applymapping1] resolvechoice2 = ResolveChoice.apply(frame = applymapping1, choice = "make_struct", transformation_ctx = "resolvechoice2") ## @type: DropNullFields ## @args: [transformation_ctx = "dropnullfields3"] ## @return: dropnullfields3 ## @inputs: [frame = resolvechoice2] dropnullfields3 = DropNullFields.apply(frame = resolvechoice2, transformation_ctx = "dropnullfields3") ## @type: DataSink ## @args: [connection_type = "s3", connection_options = {"path": "s3://cm-shinyaa31-for-glue-bucket/target/parquet"}, format = "parquet", transformation_ctx = "datasink4"] ## @return: datasink4 ## @inputs: [frame = dropnullfields3] datasink4 = glueContext.write_dynamic_frame.from_options(frame = dropnullfields3, connection_type = "s3", connection_options = {"path": "s3://cm-shinyaa31-for-glue-bucket/target/parquet"}, format = "parquet", transformation_ctx = "datasink4") job.commit()
ジョブの実行と内容の確認
ジョブの実行はメニュー上部の[Run job]押下で行われます。
実行時のパラメータ指定を促されますが今回ここは無指定でOK。[Run job]を押下。
画面はジョブ一覧に遷移し、実行ステータスが適宜分かるようになっています。
ジョブ画面でのジョブ詳細内容:
ジョブ画面での実行スクリプトコード表示内容:
実行ステータス(Run status)がSucceededとなりました。処理時間は23分掛かった模様です。ログが確認出来るようなので内容を見てみましょう。
実行ログ。
エラーログ。処理としてはエラーとはなりませんでしたが、最低限出るべき情報としては出る、という感じでしょうか。
実行内容はスクリプトとして処理後所定のパスに生成されていました。
$ aws s3 ls s3://aws-glue-scripts-999999999999-us-east-1/cm-shinyaa31-for-glue/ 2017-09-20 xx:xx:15 8153 cm-tutorial-script
Parquet形式のファイルも指定のパスに出力されている事を確認出来ました。
AWS CLIコマンドで容量を確認してみます。CSV形式の状態では1.3GBだったものがParquet形式では146MBとかなりの軽量化が為された状態で処理されている事が確認出来ました。(snappy.parquetとなっているので圧縮形式はsnappyを用いているようです)
$ aws s3 ls s3://cm-shinyaa31-for-glue-bucket/target/parquet/ --recursive --human-readable --summarize 2017-09-20 xx:xx:41 5.4 KiB target/parquet/_common_metadata 2017-09-20 xx:xx:41 189.9 KiB target/parquet/_metadata 2017-09-20 xx:xx:39 7.2 MiB target/parquet/part-00000-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:24 5.2 MiB target/parquet/part-00001-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:29 6.8 MiB target/parquet/part-00002-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 02:43:50 1.8 MiB target/parquet/part-00003-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:39 7.0 MiB target/parquet/part-00004-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:32 5.7 MiB target/parquet/part-00005-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:29 6.7 MiB target/parquet/part-00006-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:32 5.2 MiB target/parquet/part-00007-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:38 6.6 MiB target/parquet/part-00008-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:45 6.3 MiB target/parquet/part-00009-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:25 7.8 MiB target/parquet/part-00010-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:26 6.3 MiB target/parquet/part-00011-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:28 6.6 MiB target/parquet/part-00012-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:48 7.0 MiB target/parquet/part-00013-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:47 5.8 MiB target/parquet/part-00014-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:26 6.9 MiB target/parquet/part-00015-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:53 7.1 MiB target/parquet/part-00016-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:53 6.8 MiB target/parquet/part-00017-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:55 7.6 MiB target/parquet/part-00018-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:53 7.1 MiB target/parquet/part-00019-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:53 5.5 MiB target/parquet/part-00020-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:14 6.5 MiB target/parquet/part-00021-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet 2017-09-20 xx:xx:04 6.3 MiB target/parquet/part-00022-b77cc3e9-3be7-4a7f-8da2-83575a0cfd47.snappy.parquet Total Objects: 25 Total Size: 146.3 MiB
まとめ
という訳で、コンテンツとしてはかな〜り長くなってしまいましたが、AWS Glueのチュートリアル実践の内容に関するご紹介でした。実際動かしてみることで構成や処理のイメージがより具現化出来たのではと思います。今回は「CSV→Parquetのファイルフォーマット変換及び項目の選定」というケースでしたがAWS Glueではまだまだ出来る事が沢山あります!今後のエントリでもその辺り気になる部分を徹底的に触り倒してみたいと思います。