AWS Glue DataBrewを試してみた

# 背景・目的
データマネジメントのデータ品質管理を調べていた際、データプロファイリングツールについて気になりました。
データプロファイリングツールの候補として、AWS Glue DataBrew（移行、DataBrewと書きます。）について整理および動作確認を行います。

# まとめ
- TB単位のRawデータに対して、コードを書かずにデータのプロファイリングや変換、正規化が可能
- サーバの管理が不要

# 概要
[こちらのドキュメント](https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/what-is.html)を元に整理します。

## What is AWS Glue DataBrew?
下記の特徴があります。
- ユーザがコードを書かずにデータをクリーンアップ、および正規化できるようにする視覚的なデータプリパレーションツール
    - 分析や機械学習用のデータを準備する時間を最大80%削減できる
    - 250を超える、既成の変換から選択して下記のようなデータ準備タスクを自動化できるとのことです。
        - 異常のフィルタリング
        - データの標準形式への変換
        - 無効な値の修正
- ビジネスアナリスト、データサイエンティスト、データエンジニアがより簡単に共同作業し、Rawデータからインサイトを得られる
- サーバレス
- TB単位のRawデータを探索、変換可能
- 直感的なI/Fを使って対話的に検出、視覚化、クリーンアップ、変換が可能
- データ品質の問題を特定するための提案を行う
- 変換をレシピのステップとして保存し、後で更新、他のデータセットで再利用、継続的にデプロイが可能

### Core concepts and terms in AWS Glue DataBrew
DataBrewの概念と用語の概念を記載します。

|用語 |概要 |
|:-- |:-- |
|Project  | DataBrew の対話型データ準備ワークスペースを指します。<BR>下記のような関連項目をコレクションとして管理します。<BR>・データ<BR>・変換<BR>・スケジュール|
|Dataset |列またはフィールドに分割された行またはレコードを意味します。<BR>DataBrew プロジェクトを作成するときは、変換または準備するデータに接続するか、データをアップロードします。<BR><BR>DataBrew の場合、データセットはデータへの読み取り専用接続です。<BR> DataBrew では実際のデータを変更したり保存したりすることはできません。|
|Recipe |レシピとは、DataBrew に作用させるデータの一連の命令またはステップです。 レシピには多くのステップを含めることができ、各ステップには多くのアクションを含めることができます。<BR><BR>、データに加えるすべての変更を設定します。 後で、レシピの完成品を確認する準備ができたら、このジョブを DataBrew に割り当て、スケジュールできます。<BR><BR>レシピをダウンロードして、他のプロジェクトで再利用できます。 レシピの複数のバージョンを公開することもできます。|
| Job | 、レシピの作成時に設定した命令を実行することにより、データを変換する仕事を引き受けます。これらの命令を実行するプロセスはジョブと呼ばれます。 <BR>ジョブは、事前に設定されたスケジュールに従ってデータ レシピを実行できます。<BR><BR>スケジュールも、オンデマンドでも実行できます。|
| Data lineage | ビジュアルインターフェイスで、このビューでは、データが元の場所からさまざまなエンティティをどのように流れるかを示します。 その起源、影響を受けた他のエンティティ、時間の経過とともに何が起こったのか、どこに保管されていたのかを確認できます。|
| Data profile | データをプロファイリングすると、DataBrew はデータ プロファイルと呼ばれるレポートを作成します。 |

### Product and service integrations
DataBrew は、ネットワーキング、管理、ガバナンスのために次の AWS サービスと連携します。
- Amazon CloudFront
- AWS CloudFormation
- AWS CloudTrail
- Amazon CloudWatch
- AWS Step Functions

DataBrew は、次の AWS データレイクおよびデータ ストアと連携します。
- AWS Lake Formation
- Amazon S3

DataBrew は、データをアップロードするために次のファイル形式と拡張子をサポートしています。
- CSV
- Excel
- JSON
- ORC
- Parquet

DataBrew は出力ファイルを Amazon S3 に書き込み、次のファイル形式と拡張子をサポートします。
- CSV
- Parquet
- Glue Parquet
- Avro
- ORC
- XML
- JSON
- Tableau Hyper

# 実践
[Getting started with AWS Glue DataBrew](https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/getting-started.html)を元に動作を確認してみます。

## Prerequisites
1. IAMロールを作成し、AWSGlueDataBrewFullAccessPolicyをアタッチしました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a5e126df-c519-bb7c-3f25-bf15692a022c.png)

## Step 1: Create a project
1. DataBrewのトップページで「プロジェクトを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/04e97440-d030-54d1-8f74-95302e11e128.png)

1. 下記を入力し、「プロジェクトを作成」をクリックします。
    1. プロジェクト名に「chess-project」を入力
    1. データセットの選択ペインで「サンプルファイル」を選択
    1. 有名なチェスゲームの動きを選択
    1. ロール名に作成したIAMロールを選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b960114f-9670-94e9-ba57-563e6773ebef.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/89e5bf12-3995-58ff-4728-e7b92dc9c716.png)

1. プロビジョニングが開始されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a8104dbe-2009-2422-4e7f-aaff82b40381.png)
1. しばらくすると作成されます。デフォルトでは最初の５００行で構成されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/58d6f0e7-3b53-dca3-baf6-d466c63b668c.png)

## Step 2: Summarize the data
1. 変換ツールバーで、「フィルター」、「条件別」、「以上」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9a01d76f-ad8d-c646-3bbb-f7069a328f30.png)

1. 下記を設定し、「適用」をクリックします。データは66行に絞られました。
    - ソース列-white_rating
    - フィルタ条件-1800以上
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3611e757-ea1e-eded-425e-2fd306665bda.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eca406a4-19db-3609-6a8a-a1fc88405e8a.png)

1. 次に、データをサマリします。グループをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/70da5c80-5a1a-2e04-ec01-c5ea3a12a013.png)

1. グループのプロパティにて、下記を設定すると、プレビューが表示されます。確認後、「終了」をクリックします。
    - 最初の行で、winnerでグループ化
    - 2行目で、victory_statusでグループ化
    - 3行目で、wineerで、集計をカウント
    - グループタイプでは、「新しいテーブルとしてグループ」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3464bda2-76b1-a11c-a14a-314cf8e20b14.png)

1. 8行に絞り込まれました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e8a63932-ce74-4865-01f6-1aa2532168b2.png)


## Step 3: Add more transformations
このステップでは、レシピにさらに変換を追加し、その別のバージョンを公開します。 

1. 下記を設定し、「適用」をクリックします。
    - victory_status
    - フィルタ条件：Is not
    - 値：draw
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/02a3aa16-876b-68b2-ea45-de86d1700b27.png)

1. ここから、victory_statusを変更します。変換ツールバーで、消去＞置換＞値またはパターンを置換を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fdf57630-1582-d7b1-bf60-7aa7733cdbf8.png)

1. 下記を入力し、Applyをクリックします。
    - Source column:victory_status
    - Specify values to replace:Valye or pattern
    - Enter custom value: mate
    - Replace with value: checkmate
    - Apply transform to:All rows
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bdee23ea-dfb5-fcc1-a849-7d639f15f732.png)

1. victory_statusが「checkmate」に変わりました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/93c644b9-85ff-8932-ea80-4da77e5d4b0b.png)

1. 同様に、victoryを「resign」を「other player resigned」に変換します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9ce771c4-884c-a947-d67f-005043fb1f4f.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/af37d436-7475-7999-7fe2-fbe914499968.png)

1. 変更されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ef244ba3-cf42-4e97-a51c-110dfb641749.png)

1. 同様にvictoryの「outoftime」を「time ran out」に変換します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2070c3da-68b3-cc8a-db58-bb814cb536a7.png)

1. 最後に、レシピペイン右側にある「公開」を選択して作業内容を保存します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a619dbd7-8996-7ec6-165b-983624d131fc.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/17cbcda4-ff8d-3dc4-6ad5-9dae4567b7b8.png)

## Step 4: Review your DataBrew resources
サンプル プロジェクトを操作したので、これまでに作成した DataBrew リソースを確認します。

1. ナビゲーションペインで「データセット」をクリックします。データセットが確認できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/20c59b00-55cb-63a4-2155-db0a8019883d.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dab6c4c1-7ce7-c3fc-e6ed-2076631cc568.png)

1. ナビゲーションペインで「Project」をクリックします。プロジェクトが確認できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/597f7cbc-6a5e-65a4-cdc3-54e5809b3659.png)

1. ナビゲーションペインで「Recipe」をクリックします。先程Publish したRecipeが確認できました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c96282a2-e621-085d-89af-ec12b5cebf44.png)

1. recipe名をクリックすると、先程変更した内容が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/39753b4c-ca6f-e653-bb1a-c71767f13b02.png)

1. Data linageタブをクリックすると、データの変遷が確認できます。（S3→Dataset→Project→Recipe）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8cb19614-8fa2-df61-7c7a-3389023969a1.png)


## Step 5: Create a data profile
プロジェクトで作業する場合、DataBrew はサンプル内の行数や各列の一意の値の分布などの統計を表示します。 これらの統計やその他多くの統計は、サンプルのプロファイルで確認できます。
データ プロファイルをリクエストするには、プロファイル ジョブを作成して実行します。

1. ナビゲーションペインの「jobs」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/952e0f45-addb-a22b-a6fe-992b76f7ad0a.png)

1. Create jobをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a8475777-487a-2412-afa6-dc93ae097f8f.png)

1. 下記を設定し、「Create and run job」をクリックします。
    - ジョブ名に、chess-data-profile
    - ジョブタイプで Create a profile job
    - データセット名で、chess-games
    - job run sampleではFull charset
    - Job output settingsでは、S３バケットを設定
    - Permissionsでは、作成したIAMロールを設定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b8dc49b5-ccf8-ae5a-3c79-04f318817381.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6a01a374-3b8b-eae9-2fc5-7b49ea57a570.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e324c626-7464-233e-4c9d-7504eea0c3da.png)

1. 実行後のStatusは、Runningになります。Succeededになるまで待ちます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c1fc1f40-220b-99d2-db62-36154f9c37aa.png)

1. Succeededになったので、VIEW PROFILEをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1fad114a-fc76-ef71-c038-cec399441a3c.png)

1. Data profile previewでプロファイルを確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/86e6bed6-1e98-3107-655e-4c231d332a67.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ffef59ae-4859-570c-9d1d-fa225540f728.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/54794672-c2b2-d660-3aeb-e27e5441b46e.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6edf2308-04bc-e9bc-2dd2-507e280e20c2.png)

1. Data linageタブをクリックすると、プロファイルのジョブと出力されたProfileが確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e7533320-2c22-02da-2f9f-6466b6bc3e84.png)

## Step 6: Transform the dataset
DataBrew レシピ ジョブを作成してデータセット全体を変換します。
ジョブが実行されると、DataBrew はレシピをデータセット内のすべてのデータに適用し、変換されたデータを Amazon S3 バケットに書き込みます。 変換されたデータは、元のデータセットから分離されます。 DataBrew はソース データを変更しません。

1. ナビゲーションペインで「JOBS」をクリックし、「Create Job」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3c933b1c-2944-62d4-dfad-b2c4b4dc8cda.png)

1. 下記を設定し、「Cerate and run job」をクリックします。
    - job name:chess-winner-summary
    - job type: Create a recipe job
    - Job Input: dataset、chess-games、chess-project-recipe
    - Job output settings : S3のパス
    - Permissions ：作成したIAMロール
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/74012051-02ab-dbc6-d4da-f6449dd4e18e.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/54249705-929e-1d5c-174c-65b93d7a944a.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8713d6b9-8834-183b-1bd0-6d7103750f8a.png)

1. 完了しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/44259e9f-934c-5c2e-b317-351f1426df7f.png)

1. Data linageタブをクリックすると、S3に出力されている事がわかります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0a85bdbb-26d8-f014-047c-7f44317e18f1.png)

1. S3ファイルが作成されていました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/51e358b5-5ff5-f654-4e3c-6bef3be1661a.png)

1. CSVファイルも確認ができました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eff95db2-02e1-3f59-94e2-4644730a7556.png)


# 考察
今回、あらためて、DataBrewを使用してみました。
プロファイリングでは、データの特徴などが簡単に確認できるため、データの調査や現状確認に有用だと感じました。
また、データの変換などは、GUIを使用して行うのでGlueなどのETLのプログラミングが不要なため、初めての方でも利用しやすいのではないかと感じました。

# 参考
https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/what-is.html