はじめに
そろそろre:Inventですね。今年はどんなアップデートが出てくるか楽しみです。
今回は、去年のre:Inventで発表されたAWS Glue Data QualityをAWS CLIで触ってみようと思います。
具体的には、ルールを作って実行して確認する、以下の4つのステップを実行してみます。
- ルールを作成する
- ルールを実行する
- 実行情報の確認
- 結果の確認
前提条件
- 東京リージョンで実施
- Cloud9で実施
- AWS CLIはv2にバージョンアップ済み
- Cloud9はv1が入っているので、v2にバージョンアップしました
- 事前にGlue DataQualityが実行できるロールを用意しておく
- テストのテーブルとして、Glueデータカタログのテーブルを用意しておく
- 今回は、以下のようなテーブルを作成済み
やってみる
1. ルールを作成する
create-data-quality-ruleset を実行します。--target-table
は任意のパラメータですが、カタログのテーブルに紐づくことが確定しているのでこの時点で指定しておきます。
aws glue create-data-quality-ruleset \
--name category_check_test \
--ruleset 'Rules=[ColumnValues "category" in ["1", "2", "4"]]' \
--target-table \
'{
"TableName": "item_table",
"DatabaseName": "20231126_dq_test_db",
"CatalogId": "999999999999"
}'
CatalogId
はAWSアカウントIDを入れてください。
レスポンスは以下となります。ルール名が返ってきていますね。
{
"Name": "category_check_test"
}
今回は、「categoryカラムの値が1,2,4のどれかであること」というルールセットを作成しています。ルールセットを定義する記法は、以下のリファレンスをご確認ください。
2. ルールを実行する
start-data-quality-ruleset-evaluation-run を実行します。--data-source
は必須のパラメータです(さっきと同じ情報をまた入力しないといけないのがちょっと面倒…)。
aws glue start-data-quality-ruleset-evaluation-run \
--role role_name \
--ruleset-names category_check_test \
--data-source \
'{
"GlueTable": {
"DatabaseName": "20231126_dq_test_db",
"TableName": "item_table",
"CatalogId": "999999999999"
}
}'
実行時のパラメータの --role
には事前に作成している実行ロール名を入れます。また、CatalogId
は1.と同じくAWSアカウントIDを入れてください。
レスポンスは以下となります。ルールの実行ジョブは非同期実行となりますので、ジョブの状況を確認するためのRunIDが返ってきています。
{
"RunId": "dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e"
}
3. 実行情報の確認
get-data-quality-ruleset-evaluation-run を実行します。先ほどのレスポンスのRunIDをここで指定します。
aws glue get-data-quality-ruleset-evaluation-run --run-id dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e
レスポンスは以下となります。ジョブが成功している場合は Status
にSUCCEEDEDが入り、ResultIds
の値も存在します。一方、まだ実行中の場合はResultIds
が存在しません。そのため、スクリプトで情報を取るときは、ResultIds
が存在しないことも考慮してスクリプトを組む必要があります。
{
"RunId": "dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e",
"DataSource": {
"GlueTable": {
"DatabaseName": "20231126_dq_test_db",
"TableName": "item_table",
"CatalogId": "999999999999"
}
},
"Role": "arn:aws:iam::999999999999:role/role_name",
"NumberOfWorkers": 5,
"Status": "SUCCEEDED",
"StartedOn": "2023-11-26T08:21:14.365000+00:00",
"LastModifiedOn": "2023-11-26T08:22:47.632000+00:00",
"CompletedOn": "2023-11-26T08:22:47.632000+00:00",
"ExecutionTime": 76,
"RulesetNames": [
"category_check_test"
],
"ResultIds": [
"dqresult-d32c7b6a4a2c24dbeea8ba9254ba1468e74f2b37"
],
"AdditionalDataSources": {}
}
4. 結果の確認
get-data-quality-result を実行します。先ほどのレスポンスのResultIdsをここで指定します。
aws glue get-data-quality-result --result-id dqresult-d32c7b6a4a2c24dbeea8ba9254ba1468e74f2b37
レスポンスは以下となります。今回のチェックの結果はFAILとなっていますね。用意したデータのcategoryカラムは1,2,3の値が入っていますが、ルールセットでは1,2,4が入っていることと定義したので、チェックはFAILで意図通りの挙動です。
{
"ResultId": "dqresult-d32c7b6a4a2c24dbeea8ba9254ba1468e74f2b37",
"Score": 0.0,
"DataSource": {
"GlueTable": {
"DatabaseName": "20231126_dq_test_db",
"TableName": "item_table"
}
},
"RulesetName": "category_check_test",
"StartedOn": "2023-11-26T08:22:14.493000+00:00",
"CompletedOn": "2023-11-26T08:22:22.671000+00:00",
"RulesetEvaluationRunId": "dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e",
"RuleResults": [
{
"Name": "Rule_1",
"Description": "ColumnValues \"category\" in [\"1\",\"2\",\"4\"]",
"EvaluationMessage": "Value: 0.7142857142857143 does not meet the constraint requirement!",
"Result": "FAIL",
"EvaluatedMetrics": {}
}
]
}
他の操作
ここからは、ルールセットを色々試行錯誤した時に実行するであろう操作も記載しておきます。
ルールを修正する
update-data-quality-ruleset を実行します。今度はルールも1,2,3とデータに即した値に修正します。
aws glue update-data-quality-ruleset --name category_check_test \
--ruleset 'Rules=[ColumnValues "category" in ["1", "2", "3"]]'
レスポンスは以下となります。
{
"Name": "category_check_test",
"Ruleset": "Rules=[ColumnValues \"category\" in [\"1\", \"2\", \"3\"]]"
}
このルールを実行して結果を確認する場合は、上記の2.~4.をまた実行します。
ルールを削除する
delete-data-quality-ruleset を実行します。試行錯誤用のルールを作成した場合は、実際に定期実行するルールと混じってしまうので消しておきましょう。
aws glue delete-data-quality-ruleset --name category_check_test
レスポンスはありません。
おわりに
AWS CLIを使って、Glue DataQualityの各操作を実施してみました。
ジョブが非同期のため、実行状態や実行結果を取得するために操作が必要なことに注意です。
また、公式ドキュメントにはboto3を使った例も記載がありますので、併せてご参照ください。