AWS Glue 実践入門:サービスメニュー内で展開されている「ガイド付きチュートリアル」を試してみた

2017.09.21

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

AWS Glueには、公式ドキュメントによる解説の他にも管理コンソールのメニューから展開されている「チュートリアル」が存在します。まずは実際に動かしてみよう!という形でガイドも丁寧に用意されており、とても分かり易い内容となっていました。当エントリではその内容について実際に動かしてみたものを、順を追って見ていきたいと思います。

目次

AWS Glueメニューから利用可能な「チュートリアル」

AWS Glueの「get started」(入門)ページは以下のURLからアクセスする事が出来ます。(N.Virginiaの場合) 中央の「Get Started」ボタンを押下して機能画面へと遷移。

aws-glue-console-get-started

遷移後の左メニューの一番下に「Tutorials」という項があり、この配下に幾つかのパートに分かれる形でチュートリアルが展開されています。「S3上にアップロードされているCSVファイルをParquet形式に変換」するというユースケースをAWS Glueを使って実現する...という内容となっています。以降こちらの各種チュートリアルを実践する形で進めて行きます。

aws-glue-tutorial-links

aws-glue-tutorial-00 (※上記の様に、リンクを選択していくと作業ガイドが適宜出る形で チュートリアルを進める事が出来ます。)

AWS Glueチュートリアル実践

クローラの作成

クローラ情報の作成

まず初めに行うのは「クローラの追加」から。クローラは全ての種類のリポジトリのデータをスキャン・分類し、スキーマ情報を抽出、メタ−データを自動的にAWS Glueデータカタログに格納する機能を有します。

チュートリアルの「Add crawler」リンクからクローラ一覧へ遷移し、[Add Crawler]ボタンを押下。

aws-glue-tutorial-1_add_crawler_01

クローラ名とクローラ実行の際に用いるIAM roleの設定を行います。名前については任意のクローラ名を設定、IAM Roleについては前段準備段階で作成していたIAM Roleを指定し[Next]を押下。

aws-glue-tutorial-1_add_crawler_02

データストアの指定

データストアの指定。ここではAmazon S3上に存在するCSVファイルを指定します。チュートリアル用に用意されているファイル群がs3://crawler-public-us-east-1/flight/2016/csvにあるとの事なのでここではそのデータを使う事にします。配下のファイルを全て処理対象としたかったので末尾に/を付与し、s3://crawler-public-us-east-1/flight/2016/csv/と指定しました。指定後[Next]を押下。

aws-glue-tutorial-1_add_crawler_03

ちなみに配下にはどんな形でデータが入っているかというと、こんな感じ。月毎にフォルダを切った形となっています。

$ 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で指定する事も可能です。

aws-glue-tutorial-1_add_crawler_04

データストアは複数指定する事も可能です。ここでは上記指定のものだけで良いので[Next]押下で先に進みます。

aws-glue-tutorial-1_add_crawler_05

クローラのスケジュール設定

ここではクローラをどの頻度で動かすか、そのサイクルを指定します。今回はデフォルト指定の「Run on demand」のままで先に進みます。[Next]押下。

aws-glue-tutorial-1_add_crawler_06

サイクルは以下の様に細かく指定する事が可能です。データ生成のタイミングに合わせて適切な指定を行いましょう。

aws-glue-tutorial-1_add_crawler_07

クローラ出力先の指定

クローラが集めた情報を格納するための任意のデータベースを指定または作成します。既存作成済のものを指定する事も可能ですが、ここは新しく作成してみる事にします。[Add database]を押下。

aws-glue-tutorial-1_add_crawler_08

データベース名と説明を記入し、[Create]押下。

aws-glue-tutorial-1_add_crawler_09

その他選択項目はありますがここはデフォルト指定のままで[Next]押下、次へ進みます。

aws-glue-tutorial-1_add_crawler_10

プレビュー画面にて内容を確認、[Finish]を押下。

aws-glue-tutorial-1_add_crawler_11

クローラの実行

クローラが作成されました。この時点ではクローラは稼働しておらず、ステータスも「Ready」の状態となっています。

aws-glue-tutorial-1_add_crawler_12

クローラは任意のものを選択して[Run Crawler]で実行出来ます。

aws-glue-tutorial-1_add_crawler_13

クローラ実行。処理が開始され、幾らかの処理時間を要した後、停止のステータスに移行しました。

aws-glue-tutorial-1_add_crawler_14 aws-glue-tutorial-1_add_crawler_15 aws-glue-tutorial-1_add_crawler_16

停止ステータス後、ステータスは[Ready]に戻り、ログファイルが確認出来るようになりました。このリンクをクリックしてみます。

aws-glue-tutorial-1_add_crawler_17

CloudWatchのログ出力に連携しており、実行内容を以下の形で確認出来ました。

aws-glue-tutorial-1_add_crawler_18

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

また、クローラを実行した事により、指定したデータベースも合わせて作成を確認出来ました。

aws-glue-tutorial-1_add_crawler_19

テーブルの探索

テーブル一覧の表示と対象テーブルの検索

上記手順で作成したクローラ情報のデータベースについて、その内容を見ていきたいと思います。[Tables]にはAWS Glueのクローラが収集した情報がテーブルとしてデータカタログ内に格納されています。作成したデータベースを指定して、

aws-glue-tutorial-2_explore_table_01

[View Details]を選択。

aws-glue-tutorial-2_explore_table_02

テーブルの詳細情報を確認

クローラが収集したテーブル情報の詳細を確認出来る画面に遷移します。様々な情報を確認する事が出来ますが、ここでは画面右上にある[View patitions]を選択。

aws-glue-tutorial-2_explore_table_03

先程指定したS3データソースのフォルダ(パーティション)毎の情報が一覧として表示されました。[View files]をクリックすると該当のS3バケット&フォルダが表示され、[View properties]をクリックすると、

aws-glue-tutorial-2_explore_table_04

以下の様な形でパーティション情報を確認出来ます。

aws-glue-tutorial-2_explore_table_05 aws-glue-tutorial-2_explore_table_06

スキーマ情報の編集

収集したスキーマ情報は編集する事も可能です。画面右上の[Edit Schema]ボタンを押下すると、

aws-glue-tutorial-2_explore_table_07

スキーマ情報の一覧が表示されます。データ型の部分はリンク表示となっていて変更が可能となっていますので試しに変更してみましょう。一番上の項目「Year」のデータ型はbigint型となっていますが、このリンクをクリックして、

aws-glue-tutorial-2_explore_table_08

SMALLINT型に変更してみます。

aws-glue-tutorial-2_explore_table_09

変更できました。

aws-glue-tutorial-2_explore_table_10

バージョンの比較

上記手順で取得したテーブル情報の一部を変更しました。AWS Glueでは、こういった情報の「変更履歴」を管理しているのでバージョン毎の比較を行う事も可能です。[Compare versions]ボタンをクリックすると、

aws-glue-tutorial-2_explore_table_11

以下の様な形で指定2バージョンの相違を確認出来ます。これを使う事で該当のテーブルがどのような過程を経て変更され、今に至るのかという部分を把握する事が出来ます。

aws-glue-tutorial-2_explore_table_12

ジョブの追加と実行

ジョブ基本構成の設定

そしていよいよジョブの実行です。[Add job]を選択するとジョブ一覧の画面に遷移しますので[Add job]ボタンを押下。

aws-glue-tutorial-3_add_job_01

ジョブ実行に必要な諸々の設定を行います。基本設定項目は以下の通り。

Name:
ジョブ名称。任意の値を設定。
IAM Role:
ジョブ実行に用いるIAM Roleを作成済みのものから選択。
This job runs:
実行に際して用いる方法。ここでは「AWS Glueにより生成されたスクリプトを利用」する方法を選択しました。
Script file name:
スクリプトファイル名。
S3 path where the script is stored:
スクリプトファイルが格納されるS3のパスを指定。
Temporary directory:
出力結果を格納するS3パスを指定。

aws-glue-tutorial-3_add_job_02

その他、設定可能な項目は以下の様なものがあります。今回のチュートリアルでは使わないので言及はしませんが、別途機会を設けて後続のエントリで触れてみたいと思います。

aws-glue-tutorial-3_add_job_03 aws-glue-tutorial-3_add_job_04

入力データソースの指定

処理の入力情報として用いるデータソースを指定します。前述の作業で作ったCSVのものを選択。

aws-glue-tutorial-3_add_job_05

出力データソースの指定

次いで処理の出力情報とするデータソースを指定します。既存のデータソースを指定する方法と新規にデータソースを作成する2つの方法が選択可能です。ここでは新規作成の方法で進めたいと思います。

aws-glue-tutorial-3_add_job_06

一覧情報が表示されている状態で画面上部のラジオボタンのうち「Create tables in your data target」を選択。すると以下の様に所定の設定情報を選べるようになります。ここでは「データストアにAmazon S3」を選択し、「ファイルのフォーマットはParquet形式」で任意のS3パスに出力するようにしてみます。

aws-glue-tutorial-3_add_job_07

入力元(ソース)&出力先(ターゲット)のカラムマッピング指定

入力元(ソース)&出力先(ターゲット)のそれぞれのデータにおける項目の有無及び順序に関する指定を行います。ここでは末尾の項目3つを出力時に除去するケースを想定、その仕様に合うような設定をしてみます。

aws-glue-tutorial-3_add_job_08

除去を行いたいカラムの行末にある[x]印をクリック。すると、

aws-glue-tutorial-3_add_job_09

以下の様に指定・選択した行が削除されました。

aws-glue-tutorial-3_add_job_10

この手順を繰り返し、末尾3つの項目を除去しました。[Next]押下。

aws-glue-tutorial-3_add_job_11

プレビューで設定内容を確認後、[Finish]を押下。一連のジョブ情報がこれで作成されます。

aws-glue-tutorial-3_add_job_12

スクリプト生成及びダイアグラムの表示

上記作業を行うと、程無くして以下の様な画面に遷移します。AWS Glueが上記情報に基いてスクリプトを自動生成し、またスクリプトのグラフィカルな図も表示されています。

aws-glue-tutorial-3_add_job_13

画面中央のtipsダイアログを閉じるとこのような形となります。

aws-glue-tutorial-3_add_job_14

生成されたソースコードを下記に書き出してみました。

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]押下で行われます。

aws-glue-tutorial-3_add_job_15

実行時のパラメータ指定を促されますが今回ここは無指定でOK。[Run job]を押下。

aws-glue-tutorial-3_add_job_16

画面はジョブ一覧に遷移し、実行ステータスが適宜分かるようになっています。

aws-glue-tutorial-3_add_job_17

ジョブ画面でのジョブ詳細内容:

aws-glue-tutorial-3_add_job_18

ジョブ画面での実行スクリプトコード表示内容:

aws-glue-tutorial-3_add_job_19

実行ステータス(Run status)がSucceededとなりました。処理時間は23分掛かった模様です。ログが確認出来るようなので内容を見てみましょう。

aws-glue-tutorial-3_add_job_20

実行ログ。

aws-glue-tutorial-3_add_job_21

エラーログ。処理としてはエラーとはなりませんでしたが、最低限出るべき情報としては出る、という感じでしょうか。

aws-glue-tutorial-3_add_job_22

実行内容はスクリプトとして処理後所定のパスに生成されていました。

$ 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-glue-tutorial-3_add_job_23

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ではまだまだ出来る事が沢山あります!今後のエントリでもその辺り気になる部分を徹底的に触り倒してみたいと思います。