AWS Glue Data Qualityを試してみた

# 背景・目的
先日、[AWS Glue Data Quality（プレビュー版）](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-glue-data-quality-preview/)が発表されたので、仕様の理解と簡単に試してみました。
なお、現在プレビュー版であるため、GAまでに仕様が変わる可能性があります。

# まとめ
- 2022/12/14現在、プレビューである。
- Data Qualityは、OSSのDeequを利用している。
- データの品質評価には、DQDLという独自の言語を書いて実装する。
- Glueでは、Transformの一つのノードとして実装されている。

# 概要
## AWS Glue Data Qualityとは？
- 自動的にデータを分析、データの統計情報を収集
- 推奨されるデータ品質ルールを設定し、それに基づき検証を開始する。推奨されたデータ品質ルールは変更することも、新しいルールを追加することも可能。
- データ品質が低下した場合に、ユーザに警告するアクションを設定することも可能。データ品質ルールとアクションは、データパイプライン上でGlueのETLジョブに設定することも可能。
- OSSのDeequを使用してルールを評価する。

## DQDL
- Data Quality Definition Languageの略。
- AWS Glue Data Qualityのルールを定義するために使用するドメイン固有の言語。

### DQDL Syntax
- 大文字と小文字が区別される。
- 個々のデータ品質ルールをグループ化するルールセットが含まれる。
- ルールセットの作成には、Rulesという名前のリストを作成する。（以下参照）
```
Rules = [
   IsComplete "order-id",
   IsUnique "order-id"
]
```

### Rule structure
- ルールタイプにより異なるが、基本的な形式は以下の通り。
```
<RuleType> <Parameter> <Parameter> <Expression>
```
- RuleTypeは、構成するルールタイプ名。例えば以下のようなものがある。
    - IsComplete
    - IsUnique
    - CustomSql
- Rule Parametersは、ルールタイプごとに異なる。詳細は[こちら](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-rule-types)を参照。

### Rule combination
- ルールを結合するために、以下が使用できる。
    - and
        - andで接続する各ルールは括弧で加工必要がある。
        ```
        (IsComplete "id") and (IsUnique "id")
        ```
    - or
        - orで接続する各ルールは括弧で加工必要がある。
        ```
        (RowCount "id" > 100) or (IsPrimaryKey "id")
        ```

# 実践
## Tutorial: Getting started with Data Quality
[こちら](https://docs.aws.amazon.com/glue/latest/ug/tutorial-data-quality.html)を元に試してみます。

### Step 1: Add the Evaluate Data Quality node to the visual job
1. Glue Studioを開きます。
1. Action＞Evaluate Data Qualityを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/82cefc02-029e-9850-6f6b-6b26814568cf.png)

1. Parent nodeにData Sourceを指定し、デフォルトで設定されていたTargetとTransform(ApplyMapping)を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8f294033-016d-c9b5-eb58-94981d4b1be8.png)

### Step 2: Create a rule using DQDL
[DQDL](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-rule-types)を使用してルールを作成します。

1. Evaluate DataQualityのTransformタブを選択します。
1. DQDL rule builderでCompletenessを選択します。
    - Completenessは、指定された列に対して、列内の完全な値のパーセンテージをチェックします。（ここでいう完全はNull以外を指しています。）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/26f98e25-d2d7-17e5-470b-309e22f3c1cd.png)
1. Schemaタブをクリックすると、列名が表示されるので対象の列を選択します。ここでは、order_dateを選択してます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e29146b8-ad9e-6bad-8abc-29f49e942664.png)

1. ルールを変更します。ここでは90%を超える完全な値を期待しています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/98e29fd4-7035-0e74-42ca-7181e8b8110e.png)

### Step 3: Configure Data Quality actions and output
- 以下を設定します。
    - Data quality actions
        - 以下により、CWLに結果が出力されます。また、失敗した場合ロードせずに異常終了します。
            - Publish results to Amazon CloudWatchにチェック
            - Fail job when data quality failsにチェック
                - fail job without loading target dataを選択
    - Data quality transform output
        - 以下により、データ品質評価の結果を出力します。
            - Data quality results
    - Data quality output settings
        - 指定することで、データ品質評価の結果を指定したS3バケットに出力します。
- 設定結果は以下のとおりです。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2946aecb-ff7b-65d9-a5a3-085932c9be01.png)

### Step 4 : Run job
- ジョブを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8a0d8105-f382-430b-e2e6-67155e427946.png)

### Step 5: View data quality results
1. ジョブが完了したらジョブのData qualityタブをクリックします。
    - Data quality resultsを見るとDQ passedとなっています。また、その下のRule_1もRule passedになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4e8cafdb-3418-1054-6dbe-511a3a1b78e8.png)

1. Data quality output settingsでS3ファイル　に出力するように設定していたので確認します。ファイルが出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ef58aeda-95b1-1e8c-18f5-c22ea4f5e730.png)

1. S3 Selectで確認してみます。
    - 品質評価の開始と終了の時刻と、結果、メトリクスが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c7cc28bd-90e4-ee50-a8f9-1a2548651ff0.png)


# 考察
以前、データマネジメントのデータ品質を調査している過程で、Deequを知りました。当時は自前でインストールやセットアップが必要だったため、試すまで至っていませんでした。この度、Glueに統合されて簡単に利用できることがわかったので、今後は使い倒していこうと思います。

# 参考
https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-glue-data-quality-preview/

https://aws.amazon.com/jp/glue/features/data-quality/

https://docs.aws.amazon.com/ja_jp/glue/latest/ug/gs-data-quality-chapter.html

https://docs.aws.amazon.com/glue/latest/ug/tutorial-data-quality.html

https://docs.aws.amazon.com/glue/latest/dg/glue-data-quality.html

https://docs.aws.amazon.com/glue/latest/dg/dqdl.html

https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-rule-types

https://aws.amazon.com/jp/blogs/news/test-data-quality-at-scale-with-deequ/

https://github.com/awslabs/deequ