AWS Glue DataBrewを試してみた

# はじめに
この記事は [BeeX Advent Calendar 2020](https://qiita.com/advent-calendar/2020/beex) の12/21の記事です。

==
今回は11/13に発表されたAWS Glue DataBrewを試していきます。

* [AWS Glue DataBrew の発表](https://aws.amazon.com/jp/blogs/news/announcing-aws-glue-databrew-a-visual-data-preparation-tool-that-helps-you-clean-and-normalize-data-faster/)

AWS公式の以下ドキュメントを元にして進めます。

* [AWS GLue DataBrewの概要](https://docs.aws.amazon.com/databrew/latest/dg/getting-started.html)

# AWS Glue DataBrewとは
AWS公式には、Glue DataBrewとは「コードを記述せずにデータをクリーンアップおよび正規化できるビジュアルデータ準備ツール」と記載されています。
簡単に言うと、今までデータ分析などで行っていた前処理をノーコードで行うことができ、かつサーバレス構成でインフラの管理もAWSに任せてしまえるサービスになります。
便利。

# 今回のゴール
* Glue DataBrewの操作方法が何となくでも理解できること
* チュートリアルを元に構築ができること

# 実際の作業
## プロジェクトの作成
コンソールからプロジェクトの作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/3a05c5b1-24c4-f48d-3b31-da3d2d4dc06c.png)

プロジェクト名とレシピ名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/eb92a115-6daa-6612-cdb2-f44b17acf32f.png)

データセットは事前に準備されているサンプルファイルセットを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2e78a95e-01d0-f447-f169-2230d1627094.png)

サンプルファイルは全部で7つ選択可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e77f09aa-6f02-c987-0323-c54b4d21754d.png)

今回は「有名なチェスゲームの動き」を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/16e398b1-96bf-ad4c-5e67-fb2837b026f4.png)

データセット名はサンプルを選択したら設定されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/7ffd4d3b-e91b-f7d5-29d2-add70106abbf.png)

IAMロールは事前に作っておいたものを設定し、プロジェクトを作成します。
オプションは未設定状態にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d7f55e81-b93b-c3c6-7066-66e1cea7c27d.png)

アクセス許可で設定しているIAMロールの権限はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a9a8f54d-33e6-356a-8061-dd318afa17f0.png)

権限は以下を参照して作成しています。
* [IAM ロールのデータリソースのアクセス権限の追加](https://docs.aws.amazon.com/databrew/latest/dg/setting-up-iam-policy-for-data-resources-role.html)

### 作成確認
プロジェクトを作成するとプロビジョニングが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/07fd4066-28f0-d2de-4ce4-ac7ec2bbfb40.png)

プロビジョニングが完了するとサンプルデータが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/f942b30e-31f1-474b-5119-5e3090658105.png)

## データの要約
サンプルプロジェクトができたらDataBrewレシピを作成します。
このレシピとは、元となるデータセットに対して適用可能な変換処理がまとめられたもので、作成後公開することで使用することができます。
公式では以下のような条件になるように設定します。

>このチュートリアルでは、両方のプレイヤーがクラス A のゲームのみに焦点を当て、その評価が 1800 以上であることを意味します。

この評価というものがどういうものかはよくわかっていないですが、以下のWikiを見る限り「Rating range」が1800～1999の場合がクラスAになるようです。
[Chess rating system](https://en.wikipedia.org/wiki/Chess_rating_system)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/6d8505fb-e6c0-d700-1dbf-77fb673e47db.png)

### フィルタ設定
まずはデータのフィルタを行っていきます。

[フィルタ]→[条件別]→[以上]を選択します。
その後右側に詳細を入力する画面が表示されるので、ソース列に[white_rating]、フィルタ条件に[1800]を入力して適用ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/8013d9b0-80f9-9eb5-811b-8436d55c7f30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/481b54da-41f4-71f0-d463-199afaa37bec.png)

各カラムごとの値の分布を表すグラフがフィルタ条件によって少し変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d91635d9-2cb1-0f44-4d4e-d540f02465f5.png)

同じ手順でソース列に[black_rating]、フィルタ条件に[1800]を入力し適用ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/5c73f2cb-7078-2b78-8578-1692c3d5ca79.png)

レシピの項目に先ほど設定したフィルタ値2つが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/38ab7c7a-844d-b056-4362-b24397247ff7.png)

### データ要約
続いてデータの要約を行っていきます。

グループのアイコンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/92b136b3-31f2-d84e-a8d2-68dc3ea5aef0.png)

以下のようにグループプロパティを設定します。
このとき"winner"と"victory_status"は「グループ化」で設定し、[別の列を追加]ボタンから"winner"を「カウント」で追加します。
問題なければ終了を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/1ed54616-fe90-cf1d-6257-f128192dda6b.png)

最初の画面に戻ってくるので、右側レシピの発行アイコンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/5b942715-0399-5289-a216-8fe356f56f7e.png)

レシピの公開画面が表示されるので、適当にバージョンの説明に入力して発行ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/bb9d2d6d-82cc-2e21-65e1-a1ae0c1b0655.png)

Test-Project-recipe下にバージョン1.0と表示されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e02354ec-0c6a-f30c-0515-62c266ce7a3d.png)

## 変換処理の追加
先ほどのレシピに変換処理を追加していきます。

### 引き分け試合の除外
先ほどと同じ手順でフィルタ値設定画面を表示し、ソース列に[victory_status],フィルタ条件に[でない],Unique values値の[draw]にチェックを入れて適用ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e6b40ef1-05e4-9324-5ae6-0a5e5b61dacf.png)

フィルタが追加され、バージョン情報の横に「1件の未公開の変更」という文字が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c1cd83ec-cea1-0b70-c180-77fa1d762bcd.png)

### 値の置き換え
データの置換を行っていきます。
[クリーン]→[値またはパターンの置き換え]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/5173f648-a578-bece-d948-e876a14fc613.png)

以下のように設定し、"mate"という文字列を"checkmate"に置換する設定をして、適用ボタンを押下します。
※後で気づきましたがソース列はwinnerではなくてvictory_statusが正しいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/0dd09860-4821-7360-2235-95b68ab99311.png)

同じ手順で他の値も置換設定します。
※後で気づきましたがソース列はwinnerではなくてvictory_statusが正しいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/b8411213-a215-a8f5-0d3a-3426dbcfb11d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/6f23642b-b4ea-e1dc-c5fd-12ce9c649531.png)

変換されていることが確認出来たらレシピの発行ボタンから変更を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/1b293038-607f-0ce6-a2fc-4dc17a0277d7.png)

## DataBrewリソース確認
作成したDataBrewリソースを確認していきます。

データセットを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/383f98fc-a9a1-9bde-0fb4-c72016ba6b55.png)

データセットにはサンプルプロジェクトで作成されたデータセットが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a83a8663-a46c-4290-10e9-368e4259594c.png)

元となるデータはS3に保存されているエクセルファイルとして格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/4aa3a5ab-28d6-fea9-54b0-c4a1ede58bd1.png)

プロジェクトを選択して、先ほどレシピの設定をしていたプロジェクトがあることを確認します。
DataBrewでは、プロジェクトに対してデータセットとレシピが必須になります。
今回はサンプルプロジェクトを使用したため、データセットと空のレシピが自動で作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/f160676e-a1fc-a022-f428-6612a776ae30.png)

レシピを押下して、作成したレシピが表示されることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/1c3bbcb8-1211-4e7d-ec0e-b49a09963be2.png)

## データプロファイル作成
DataBrewではデータの統計情報をプロファイルとして表示します。
データプロファイルはジョブを作成して実行することで作成されます。

ジョブを選択して、「ジョブを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e5b048c5-226e-c790-6338-176b76e8751f.png)

ジョブ名、ジョブタイプ、データセット、ジョブ出力先を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/647a3c4a-d193-a581-e33d-83a7672066cb.png)

アクセス許可のロールに、DataBrewサービスからS3にアクセス可能な権限を持ったIAMロールを指定します。
ここまで入力できたら設定できたら「ジョブを作成し実行する」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/8429e10c-fd70-5b15-0117-a50a3b0bd436.png)

ジョブ実行履歴からステータスが実行中になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d7700b6f-d311-c8a0-ead7-6026cf8817de.png)

実行が完了したことを確認したら右上のプロフィールを表示アイコンを押下すると、データプロファイルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/40c9acdb-d48e-7098-58de-0be753a0d5c1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/5996a069-136e-8909-b5f3-d109109f96bd.png)

列の統計タブを表示するとデータの品質や値の分散具合、欠落データの値などのデータインサイトを見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a0adfe7b-4c68-6ad6-8e47-2c5c0433a2e0.png)

ジョブで処理されたデータはファイルとして指定してS3にアップロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c2f8a0f6-512b-a376-348f-d84cf1780a3d.png)

# おわりに
以上、サンプルプロジェクトのデータを元に、DataBrewを使用してフィルタをかけたり、統計の生成などをノーコードで実施してみました。

イマイチ使いきれていない感はありますが、データソースにDataBrewからアクセスさせることができれば、データのクリーニングやフィルタリングなどが簡単に実施することができました。

最初聞いたときは現行のGlueをノーコードで行うことができるようなイメージでしたが、実際にそれと同じレベルで設定するときはより深いサービスへの習熟が必要そうでした。