はじめに
以前、QuickSightで高コストが発生した失敗を記事にしました。
本来の目的はデータ分析の学習だったため、今回は改めてAWSを利用したデータ分析基盤の構築を備忘録として残します。
具体的には、過去10年分の気象データをAmazon S3に取り込み、AWS GlueでETL処理を行い、Amazon Athenaを利用してデータ分析を実施するまでの手順を紹介します。
今回はGlueでデータ変換するまでを記し、次回はAthenaでクエリ実行するまでを記します。
1.事前準備
1-1.テストデータの準備
データの準備:今回は気象庁のサイトから全国主要都市の気象データ(CSV)をダウンロードしました。
Glueはデフォルトで文字コードをUTF-8で認識するため、テキストエディタでCSVファイルを開いて、S-JISをUTF-8に変換して保存しました。
ダウンロードしたデータは扱いやすいように、以下の形式に手で修正しました。
☆のフィールドはGlueでデータ変換時に不要とするデータです。
・全国主要都市の月別気象データ形式(CSV)
Date, // 日時
City, // 都市名
Average temperature (°C), // 平均気温
Total precipitation (mm), // 総合雨量☆
Average humidity(%) // 平均湿度☆
Date,City,Average temperature (°C),Total precipitation (mm),Average humidity(%)
2017/1/1,Sapporo,-3.9,72.5,70
2.S3バケットの作成と元データの配置
2-1.S3バケットの作成
S3で以下のバケットを作成します。
・入力用バケット(bunseki-weather-data-in)
・出力用バケット(bunseki-weather-data-out)
・Athenaのクエリ結果保存用バケット(bunseki-athena-query-result)
2-2.データのアップロード
ダウンロードしたCSVファイルを入力用バケットへアップロードします。
2-3.IAMロールの準備
IAMロールの準備:GlueがS3にアクセスするためのIAMロール(AWSGlueServiceRole などの権限が付与されたもの)を作成します。
・許可を追加 > ポリシーをアタッチ > AWSGlueServiceRole を追加する

・許可を追加 > インラインポリシーを作成を選択する
・S3リソースにアクセスするためのポリシーを定義する
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bunseki-weather-data-in",
"arn:aws:s3:::bunseki-weather-data-in/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::bunseki-weather-data-out",
"arn:aws:s3:::bunseki-weather-data-out/*"
]
}
]
}
・ポリシーエディタでJSON形式を選択、上記のポリシーを貼り付け

・ポリシー名(例:GlueAccessToBunsekiBucket)を入力して、ポリシーの作成を選択する

・許可ポリシーにインラインポリシーが追加されたことを確認する

3.AWS Glue StudioによるETL処理(データ変換)
3-1.データ抽出の設定
S3からデータを抽出する設定を行います。
・AWS Glueの左側メニューからETL jobs > VisualETLを選択する

・AWS Glue Studio > Get Started > Visual ETLを選択する

・Job Detailsタブを選択する
任意のjob名と2-3.IAMロールの準備で作成したIAM roleを付与したら、Saveで保存します。

・Add notesのSourceタブでAmazon S3を選択する

・Nameに任意のデータ抽出処理の名前(例:bunseki-input)を入力する
・S3 URLにアップロードしたデータを入力する
・Data formatはCSVを選択する
・DelimiterはComma(,)を選択する
・Data Preview欄にデータが表示される(最大200件)
・データ抽出できたら、Saveする
ここで、データが表示されない場合、要因は以下の2つが多いです。
・GlueがS3リソースにアクセスする権限が不足している
・データ側の文字コードが判別できないなどデータ側に問題がある
3-2.データ変換の設定
抽出したデータに対して、データ変換を行います。
Add Nodesからスキーマを変更するためのノードを追加します。
・TransformsタブでChange Schemaを選択する

ノード追加時に、どの順番で処理を実施するか明示するために、前処理を選択した状態でAdd nodesから処理を選択する必要があります。
前処理を選択しない状態でノードを追加しても前処理と後処理をマウスで繋ぐと処理を繋ぐことが出来ます。
・NameにChange Schema処理の任意の名前(例:bunseki-Change-Schema)を入力する
・不要なデータはDropにチェックを入れる(今回は雨量と湿度を除外する)

・YYYY/MM/DDを日付データに更新するため、Add NodesからSQL Queryを選択する

・NameにSQL Query処理の任意の名前(例:bunseki-SQL-Query)を入力する

・SQL queryで年月日の区切りを"/"から"-"に置き換えるSQLを設定する
SELECT CAST(REPLACE(`date`, '/', '-') AS DATE) AS `date`,
`city`,
`average temperature (°c)`
FROM myDataSource
3-3.変換データの保存先を設定
・前処理のSQL Queryを選択した状態で、Add nodesからTargetsタブのAmazon S3を選択する

・Nameに任意のデータ抽出処理の名前(例:bunseki-output)を入力する
・S3 URLに変換データの格納先を入力する
・Saveで保存し、Runで実行、結果を確認する

・Runsタブを選択して、Run statusの結果がSucceededになったことを確認する

後編へ続く
