AWS Glue Data Quality(プレビュー)でデータ品質検査を試してみた

マネージドなデータ品質検査ができます
2023.01.18

データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。

昨年末に開催されたAWS re:Inventにて、データ品質の検査を可能にする新機能AWS Glue Data Qualityが発表されました。本エントリでは実際にどんなことができるのかご紹介します。

なお、本機能は2023年1月現在のパブリックプレビュー段階のものであり、GA(General Availability:一般利用可能)なステータスとなった際には仕様が変更されている可能性があることをご留意ください。

AWS Glue Data Qualityとは

ユーザーが定義したルールに従って、データの品質検査を実施できる機能です。AWS Glue Studioではビジュアルエディタから「Evaluate Data Quality」ノードを追加し、DQDL(Data Quality Definition Language)という独自の言語で定義します。(後述しますが、独自の言語とは言ってもDQDLビルダーもあり、それほど複雑なものではないので学習コストは低いです)

データ分析の最終的なゴールは分析結果をもとに意思決定を行うことです。適切な意思決定には信頼できる正確なデータを使う必要がありますが、データというものは様々な理由で変化し、意図しない形になるケースがあります。

そこでデータの品質をモニタリングし、問題を検出して品質改善につなげて正確なデータであることを担保します。これまでは自前で品質検査の仕組みを作る必要がありましたが、AWS Glue Data Qualityの登場によりマネージドな環境で品質検査ができるようになりました。

データ品質検査をしてみる

公式ドキュメントに記載されたチュートリアルに従って設定をします。

Evaluate Data Qualityノードを追加する

AWS Glue Job Studioのジョブ作成画面からビジュアルジョブエディタを選びます。Actionのドロップダウンリストから、他のトランスフォームのノードと同じようにEvaluate Data Qualityノードを追加できます。

DQDLで品質検査ルールを定義する

Evaluate Data Qualityノードを選択すると右ペインに設定画面が表示されます。

Transformタブに移動し、DQDL rule builderでルールを定義します。Rule Typesから各ルールタイプが選択可能です。+ボタンから選択したルールタイプが右側のルールエディタに追加されます。今回は「order_idというカラムの80%以上にデータが存在している」ルールを設定しました。

Shemaタブにはインプットデータのカラム名とデータ型が一覧で確認できるようになっています。+ボタンを押すことでルールエディタにカラム名を挿入できます。

DQDLで他にどんな定義ができるのかは後述します。

アクションとアウトプットを設定する

Data quality actionsからは以下の設定が可能です。

  • 実行結果をCloudWatchにパブリッシュ
  • インプットデータが品質検査ルールを満たさなかった場合にジョブを停止
    • ターゲットデータをロードせずに異常終了するか、ロードした後に異常終了するか選択可能

Data quality transform outputでは、データ品質検査の出力内容が設定できます。

  • Original Data
    • オリジナルのインプットデータを出力する
    • 品質問題が検出されたときにジョブを停止させたい場合に最適
  • Data quality results
    • 設定されたルールと合格または不合格のステータスを出力
    • 品質問題が検出されたときに独自にアクションを取りたい場合に最適

Data quality output settingsのオプションで品質検査の結果を任意のS3バケットにアウトプットできます。何も指定しない場合は後述するData qualityタブから結果csvファイルをダウンロードできます。

品質検査結果を確認する

ジョブ実行が完了するとData qualityタブから品質検査の結果が確認できました。どのルールに合格・不合格したのかをコンソール上で確認できるほか、結果をcsv形式でダウンロードもできます。

期間を指定して結果を表示させることも可能です。

前述したData quality output settingsでアウトプット先のS3バケットを指定していたので、以下のような形で出力されていました。

S3 Selectすると品質検査の結果が取得できました。

{
  "jobName": "DataQualityTutorial",
  "jobRunId": "jr_e4c57ce01f2bb7872b7d7f29aa78e4e52cc565618cce0be6a5c96f20ee8b83c5",
  "evaluationContext": "EvaluateDataQuality_node1673947412652",
  "evaluationStartedOn": "2023-01-18 06:02:37.727",
  "evaluationCompletedOn": "2023-01-18 06:02:45.74",
  "rule": "Completeness \"order_id\" > 0.8",
  "outcome": "Passed",
  "failureReason": null,
  "evaluatedMetrics": "{Column.order_id.Completeness -> 1.0}"
}

DQDLで定義できるルール

基本的な操作方法はざっくりと把握できたところで、他にどんなルールが定義可能かまとめました。以下を参考にしており、記述例もドキュメント記載のものを引用しています。

DQDLシンタックス

DQDLでルールを定義する際は以下のように記述します。ルールが複数ある場合はカンマで区切って定義します。

Rules = [   IsComplete "order-id",   IsUnique "order-id" ]

DQDLで定義可能なルール

ColumnCorrelation

2つの列の相関をチェックします。AWS Glue Data Qualityは、ピアソン相関係数を用いて2つのカラム間の線形相関を測定します。結果は-1から1の間の数値で、関係の強さと方向を測定します。

例:身長と体重の相関係数が強い正の相関(係数値が0.8以上)を持つかどうかをチェック

ColumnCorrelation "height" "weight" > 0.8

ColumnExists

カラムが存在するかどうかチェックします。

例:Middle_Nameカラムが存在するかどうかチェック

ColumnExists "Middle_Name"

ColumnLength

値の長さが指定した数値と合致するかチェックします。

例:Postal_Codeの値が5桁かどうかチェック

ColumnLength "Postal_Code" = 5

ColumnValues

カラムの値に対して、指定した式と合致するかチェックします。正規表現や式を利用でき、汎用的に使えるルールです。利用可能な条件式はExpressionsをご参照ください。

例:与えられた値の集合のどれかに一致しているかどうかチェック

ColumnValues "Country" in [ "US", "CA", "UK" ]

例:正規表現と合致するかチェック

ColumnValues "First_Name" matches "[a-ZA-Z]*"

例:日付が指定した条件式と合致するかチェック

ColumnValues "Load_Date" > (now() - 3 days)

例:数値条件に合致するかチェック

ColumnValues "Customer_ID" between 1 and 2000

Completeness

カラム内の完全な値(NULLではない値)の割合をチェックします。

例:カラムの値(First_Name)の95%以上がNULLではない値であるかチェック

Completeness "First_Name" > 0.95

CustomSql

データセットに対してカスタムSQL文を実行し、その戻り値を指定された式と合致するかチェックします。注意すべき点として、SQL文は単一の数値を返す必要があります。

例:データセットのレコード数が10~20件の間かどうかチェック

例の通り、FROM句にはデータセットの名前ではなくprimaryを指定します。ビジュアルエディタで品質検査を実施する場合、primaryEvaluateDataQuality.apply()に渡されるDynamicFrameを表します。AWS Glue Data Catalogを使用してテーブルに対してデータ品質タスクを実行する場合はテーブルを表しています。

CustomSql "select count(*) from primary" between 10 and 20

DataFreshness

データの鮮度を評価します。ここで指定できるカラムのデータ型はDate型のみ。

例:Order_Dateが24時間以内かどうかチェック

DataFreshness "Order_Date" <= 24 hours

DistinctValuesCount

カラム内の異なる値の数をチェックします。

例:Stateカラムに3つ以上の異なる値が含まれているかチェック

DistinctValuesCount "State" > 3

Entropy

エントロピー値が指定した式に一致するかどうかをチェックします。エントロピーはメッセージに含まれる情報のレベルを測定します。列の値に対する確率分布があるとき、エントロピーは値を識別するために何ビットが必要か表します。ものすごくざっくり説明すると、おそらくカラムの値がどれだけバラバラなのかチェックできるのだと思われます。(エントロピー値が大きければ大きいほど情報量が少なく、あまり意味のなさないデータとなりますが、エントロピー値が減少すると情報量が増えます。)

例:Star_Ratingカラムのエントロピー値が1より大きいかどうかをチェック

Entropy "Star_Rating" > 1

IsComplete

値がすべて完全であるかどうか(すべて非NULLであるかどうか)をチェックします。

例:emailカラムにNULL値が含まれていないかどうかチェック

IsComplete "email"

IsPrimaryKey

対象カラムが主キーを含むか(カラムの値がすべて一意で完全であるかどうか)チェックします。

例:Customer_ID が主キーを含むかチェック

IsPrimaryKey "Customer_ID"

IsUnique

カラム内のすべての値が一意であるかどうかチェックし、bool値を返します。

例:emailカラムの値がすべて一意であるかどうかチェック

IsUnique "email"

Mean

対象カラムのすべての値の平均が指定された式に一致するかどうかをチェックします。

例:Star_Ratingカラムのすべての値の平均が3を超えるかどうかチェック

Mean "Star_Rating" > 3

RowCount

データセットの行数を指定された式でチェックします。

例:インプットデータの行数が10~100の間であるかどうかチェック

RowCount between 10 and 100

StandardDeviation

対象カラムの標準偏差を指定された式でチェックします。

例:Star_Ratingカラムのすべての値の標準偏差が1.5以下であるかどうかチェック

StandardDeviation "Star_Rating" < 1.5

Sum

対象カラムのすべての値の合計を指定した式でチェックします。

例:transaction_totalカラムのすべての値の合計が500000以上であるかチェック

Sum "transaction_total" > 500000

Uniqueness

対象カラムの一意な値の割合を指定した式でチェックします。

例:emailカラムの一意な値の割合が100%であるかチェック

Uniqueness "email" = 1.0

UniqueValueRatio

カラムの一意な値の比率をチェックします。例えば、[a,a,b]という集合は一位の値aと二つの異なる値abから構成されます。この場合、一意な値の比率は½ = 0.5となります。

例:test_scoreの一意な値の比率が0~50%の範囲であるかチェック

UniqueValueRatio "test_score" between 0 and 0.5

最後に

パブリックプレビューのAWS Glue Data Qualityで品質検査を実施してみました。2023年1月現在、以下の制限があることをご留意ください。(冒頭でも言及した通り、一般利用開始された際の使用とは異なる可能性があります)

  • データソースはS3のみ対応
  • Glue 3.0でのみ対応
  • ネストされたデータソースやリスト型データソースは評価できない
  • プレビューは以下のリージョンで使用可能
    • US East (Ohio)
    • US East (N. Virginia)
    • US West (Oregon)
    • Asia Pacific (Tokyo)
    • Europe (Ireland)

参考