本仕様では、DataWorks Data Quality モジュールにおける Data Quality モニタリングおよびルールのリソースを定義します。この仕様は YAML 形式で記述され、OpenAPI のリクエストパラメーターとして使用され、DataWorks Data Quality プロダクト内のリソースを管理します。
基本概念
YAML の例
単純な Data Quality モニタリングルールは、以下のように定義されます。
datasets:
- type: Table
tables:
- tb_d_spec_demo
dataSource:
name: odps_first
envType: Dev
rules:
- assertion: row_count > 0プロパティの説明
上記の仕様例では、単純な Data Quality モニタリングルールが定義されています。
datasets: Data Quality の監視対象です。以下の 3 つのプロパティを含みます。type: 監視対象の種類です。現在はTableのみがサポートされる列挙値です。dataSource: 監視対象のデータソースです。nameおよびenvTypeを設定することで、データソースを特定できます。データソース名は、ListDataSources 操作を呼び出して取得できます。説明現在、一部のデータソースのみがサポートされています。詳細については、「サポートされるデータソースの種類一覧」をご参照ください。
tables: 監視対象が `Table` の場合、テーブル名を設定できます。説明データソースがデータベースレベルでアタッチされており、非デフォルトスキーマ内のテーブルをモニタリングする必要がある場合は、
schema.table形式でテーブルを指定できます。
rules: データが満たすべきルールです。Data Quality モニタリング構成には複数のルールを含めることができます。Data Quality モニタリングが実行されると、監視対象のデータがスキャンされ、各ルールについてメトリック値が算出され、期待されるしきい値と比較されます。この比較結果により、ルールが通過したかどうかが判定されます。
通常、データの期待値は
assertion文で記述されます。この文には、row_countのようなメトリックタイプ、>のような比較演算子、0のようなしきい値が含まれます。チェック結果は、以下の 3 つの状態のいずれかになります。pass: チェックに合格しました。収集されたメトリック値がしきい値で定義された範囲内です。
fail: チェックに不合格です。収集されたメトリック値がしきい値で定義された範囲外です。
error: エラーが発生しました。構文エラーなどのその他の例外がチェック中に発生しました。
説明warnレベルのしきい値を明示的に指定した場合、チェック結果はwarnにもなり得ます。詳細については、「マルチレベルしきい値定義の追加」をご参照ください。assertion文で使用可能な サポートされる組み込みシステムメトリックタイプ をご確認ください。品質モニタリングルールを作成する際には、カスタムメトリックルール を使用することもできます。
しきい値定義方法
assertion 文では、以下のしきい値定義方法がサポートされています。
固定しきい値
この方法は、メトリック値を固定値と直接比較するシナリオに適しています。固定しきい値の定義には、以下の要素が含まれます。
メトリック
引数(任意)
比較演算子(任意)
しきい値(任意)
構成例
rules:
# データ行数は 0 より大きい必要があります。
- assertion: row_count > 0
# size フィールドの最大値は 500 以下である必要があります。
- assertion: max(size) <= 500以下の表では、固定しきい値式の 4 つの要素について説明します。
式の要素 |
|
|
メトリック |
|
|
引数(任意) | / |
|
比較演算子(任意) |
|
|
しきい値(任意) |
|
|
サポートされる比較演算子の詳細については、「サポートされる比較演算子」をご参照ください。
変動しきい値
この方法は、現在のメトリック値を同一メトリックの過去の値と比較するシナリオに適しています。たとえば、今日のユーザー数と昨日のユーザー数の差が 100 以内であること、または今日の売上高と過去 7 日間の平均売上高の変動率が 10 % 以内であることなどを保証できます。
通常、変動しきい値を記述するには、metric の前に change for を追加します。変動しきい値の定義には、以下の要素が含まれます。
change(キーワード)
集約型(オプション)
タイムウィンドウ
percent(キーワード、任意)
for(キーワード)
メトリック
引数(任意)
比較演算子(任意)
しきい値(任意)
結合された式の形式は、change [集計方法] [タイムウィンドウ] [percent] for メトリック [引数] [比較演算子 しきい値] です。
構成例
例 1:指定されたタイムウィンドウのチェック結果との差分を比較
change ... for の間に タイムウィンドウ を指定することで、現在のメトリック値と比較する過去のメトリックを明示的に指定できます。
rules:
# 現在のデータ行数と 7 日前のチェック時のデータ行数の差が 10,000 以内である必要があります。
- assertion: change 7 days ago for row_count < 10000例 2:指定されたタイムウィンドウのチェック結果を集計してから差分を比較
change と タイムウィンドウ の間に集計方法(集計方法)を追加できます。システムは、指定された集計方法を使用して、タイムウィンドウ内のチェックレコードから中間結果を算出し、この結果を現在のチェックの基準値として使用します。
rules:
# 現在のデータ行数と過去 7 日間の平均データ行数の差が 10,000 以内である必要があります。
- assertion: change average last 7 days for row_count < 10000以下の 2 つの集計方法がサポートされています。
avg:平均値
var:分散
集計方法を指定しない場合、システムは現在のメトリック値をタイムウィンドウ内のすべての過去のチェックレコードと比較し、最も重大な深刻度のステータスを最終的なチェックステータスとして使用します。
例 3:過去のチェック結果との変動率を比較
percent を change ... for の間に追加すると、しきい値との比較前に変動率が計算されます。
rules:
# 現在のデータ行数と 7 日前のチェック時のデータ行数の変動率が 50 % 以内である必要があります。
- assertion: change 7 days ago percent for row_count < 50%読みやすさを向上させるために、しきい値の末尾に % 記号を付けることができます。
現在のメトリック値を
c、前回の値をclとすると、percent = (c-cl) / clとなります。cl が 0 かつ c も 0 の場合、計算された変動率は 0 です。
cl が 0 で c が 0 でない場合、変動率は計算できず、チェック結果は `error` になります。
結果は負の数になることがあります。しきい値を定義する際には、この点に注意してください。変動率の範囲を定義するには、後述の `between...and...` を使用できます。
範囲しきい値
between...and... を使用して、しきい値の範囲を定義できます。
閉区間しきい値の定義
between...and... で定義された区間は、デフォルトで閉区間です。たとえば、日次行数の変動率が [-1 %, 1 %] の範囲外の場合に `warn` がトリガーされ、[-5 %, 5 %] の範囲外の場合に `fail` がトリガーされます。値が [10, 15] の区間内にある場合、チェックは合格します。
datasets:
- type: Table
tables:
- tb_d_spec_demo
filter: dt='$[yyyymmdd]' AND hh='$[hh24-1/24]'
dataSource:
name: odps_first
envType: Dev
rules:
- assertion: change 1 day ago percent for row_count
warn:
- when not between -1% and 1%
fail:
- when not between -5% and 5%マルチレベルしきい値定義の追加
ルールの assertion 文で期待されるしきい値を定義するほか、assertion 文から期待されるしきい値を省略し、ルールの warn または fail プロパティを設定することで、より細かい粒度のしきい値レベルを定義できます。たとえば、以下のようになります。
rules:
- assertion: duplicate_count(phone)
warn: when between 1 and 10
fail: when > 10上記のコードスニペットでは、warn および fail の 2 つのしきい値レベルが定義されています。
phoneフィールドの重複行数が0の場合、チェックは合格します。phoneフィールドの重複行数が 10 より大きい場合、チェックは不合格になります。phoneフィールドの重複行数が 1 ~ 10 の間の場合、チェック結果はwarnになります。
warn および fail のしきい値範囲が重複する場合の処理ポリシー
warn および fail のしきい値範囲は重複することがあります。メトリック値がこの重複範囲に該当する場合、システムはより重大なステータスを使用します。結果は fail になります。
not between...and... を使用した区間の補集合の定義
not を between...and... の前に使用すると、区間の補集合を得られます。たとえば、以下のようになります。
rules:
- assertion: duplicate_count(phone)
warn:
- when not between -1% and 1%
fail:
- when not between -5% and 5%上記のコードスニペットで定義された区間を、以下の図に示します。
ルールの固有識別子の設定
ルールに対して identity を指定できます。これは、同じ Data Quality モニタリング範囲内でのルールの固有識別子として機能します。
ルール作成時に
identityを指定しない場合、システムが自動的にidを割り当てます。identityは、同じ Data Quality モニタリングルール内で一意である必要があります。そうでない場合、更新が失敗したり、誤って他のルールが更新されたりする可能性があります。管理を容易にするため、読みやすい文字列の使用を推奨します。変動しきい値(
change...for...)および異常検出ルール(anomaly detection for ...)を持つルールでは、ルールのidentityを使用してチェック履歴を照会します。システムが品質モニタリング構成の更新リクエストを受信した場合、以下の手順で処理します。
まず、更新リクエスト内の各ルールを走査し、ルールの
idを使用して、品質モニタリング構成内の既存のルールを照合・更新します。品質モニタリング構成内で一致する
idを持たない既存のルールを削除します。更新リクエスト内の残りのルールを、品質モニタリング構成内の新規ルールとして作成します。
以下の例では、identity の指定方法を示します。
rules:
- assertion: row_count > 0
name: データ行数が 0 より大きいこと
# Data Quality モニタリング範囲内で一意の識別子を指定します。
identity: table-not-emptyルールのビジネス上の深刻度レベルの定義
severity を設定することで、ルールがビジネスに与える影響の深刻度をマークできます。これにより、その後の管理が容易になります。たとえば、以下のようになります。
rules:
- assertion: row_count > 0
severity: Highseverity プロパティでは、以下の 2 つのレベルがサポートされています。
High
Normal(デフォルト)
ルールの有効化ステータスの設定
enabled フラグを指定することで、ルールの有効化ステータスを管理できます。一時的に使用しないが削除したくないルールについては、enabled を false に設定します。これにより、ルールが一時的に無効化され、モニタリング実行時にトリガーされなくなります。
rules:
- assertion: row_count > 0
# ルールの有効化ステータス。デフォルト値は true です。
enabled: false前提条件文の設定
一部のビジネスシナリオでは、メトリックを計算する SQL を実行する前に、パラメーターを調整するために SET 文を実行する必要があります。これにより、メトリック計算 SQL が正しく実行されることが保証されたり、パフォーマンスが確保されたりします。ルールに settingConfig を設定できます。たとえば、以下のようになります。
rules:
- assertion: row_count > 0
# 実行する前提条件 SET 文を設定します。
settingConfig: SET odps.sql.udf.timeout=600s; SET odps.sql.python.version=cp27;問題のあるデータを保持するスイッチの設定
ルールレベルで、問題のあるデータを保持するスイッチを有効化できます。ルールチェックが合格しなかった場合(warn または fail ステータス)、システムは自動的に失敗の原因となったデータをフィルター処理し、監視対象のテーブルと同じデータベース内の別のテーブルに保存します。問題のあるデータを保持するスイッチを有効化するには、以下の構成を使用します。
rules:
- assertion: duplicate_count(phone) = 0
collectFailedRows: truecollectFailedRows を true に設定すると、問題のあるデータの保持が有効化されます。カスタム SQL ルールでは、failedRowsQuery を明示的に指定して、問題のあるデータを保持するためのフィルター文を構成する必要があります。
rules:
- assertion: id_null_count = 0
id_null_count:
expression: id IS NULL
collectFailedRows: true
failedRowsQuery: SELECT * FROM tb_d_spec_demo WHERE dt = '$[yyyymmdd-1]' AND id IS NULLカスタム SQL ルールに加えて、以下のメトリックのみが問題のあるデータの保持をサポートしています。その他のメトリックについては、現時点では collectFailedRows の有効化はサポートされていません。
missing_count
missing_percent
duplicate_count
duplicate_percent
distinct_count
distinct_percent
ルール名および説明の設定
ルールの管理を容易にするために、ルール名および説明を設定できます。
たとえば、全体のモニタリング構成に名前を設定したり、各ルールに個別の名前を設定したりできます。これらの名前は、その後のチェック結果や UI ページで管理を容易にするために使用できます。
datasets:
- type: Table
tables:
- tb_d_spec_demo
filter: dt='$[yyyymmdd]' AND hh='$[hh24-1/24]'
dataSource:
name: odps_first
envType: Dev
rules:
- assertion: row_count > 0
# ルール名および説明
name: データ行数が 0 より大きいこと
description: 出力データは空であってはなりませんデータフィルタリングの設定
ルールに対するデータフィルタリングの設定
ルールのチェック時に、メトリック統計に使用するデータのサブセットのみが必要な場合、ルールに filter 設定を追加できます。たとえば、id フィールドが NULL でないデータのみをカウントする場合です。
rules:
- assertion: row_count > 0
filter: id IS NOT NULL品質モニタリングに対するデータフィルタリングの設定
filter 設定を Scan.Dataset に追加することもできます。この場合、filter は、チェックプロセス中に品質モニタリング構成内のすべてのルールに適用されます。
datasets:
- type: Table
tables:
- tb_d_spec_demo
filter: dt='$[yyyymmdd]' AND hh='$[hh24-1/24]'
dataSource:
name: odps_first
rules:
- assertion: row_count > 0上記のコードスニペットでは、filter 設定が dataset に追加されています。各ルールのチェック時には、まずこの filter を使用してデータがフィルター処理され、その後にチェックが実行されます。
例の filter 定義では、時間式 $[yyyymmdd-1] が使用されています。システムは、この式を filter 内で triggerTime パラメーターと時間オフセットに基づいて計算された値に置き換えます。サポートされるパラメーター参照方法の詳細については、「データフィルタリング構成」をご参照ください。
付録
サポートされる比較演算子
>
>=
<
<=
=
!=
between ... and ...
サポートされるデータソースの種類一覧
以下のデータソースの種類がサポートされています。
maxcompute
hologres
emr
mysql
analyticdb_for_mysql
analyticdb_for_postgresql
cdh
starrocks
サポートされる組み込みシステムメトリックタイプ
avg
row_count
sum
min
max
distinct_count
distinct_percent
table_size
missing_count
missing_percent
duplicate_percent
duplicate_count
group_by
invalid_count
invalid_distinct_count
タイムウィンドウの定義方法
DataWorks Data Quality では、複数のタイムウィンドウ定義方法がサポートされています。基本的なフォーマットは以下のとおりです。
n 時間単位前:
n (minute[s]|hour[s]|day[s]|week[s]|month[s]) ago。たとえば、n months ago、n days ago、n hours agoなどです。1 day ago
7 days ago
1 month ago
8 hours ago
15 minutes ago
相対時間範囲:
last n (minute[s]|hour[s]|day[s]|week[s]|month[s])。たとえば、last 15 minutes、last 7 days、last 1 monthなどです。last 15 minutes
last 24 hours
説明現在時刻の 24 時間前から現在時刻までを対象とし、1 時間ごとに 1 つのデータポイントが収集されます。
last 7 days
last 1 month
1/2/3/.../-3/-2/-1 of (current|last|n) (months|weeks) (ago)当月1日の同時刻:当月の1日
先月の最終日の同時刻:-1 of last month
3 週間前の火曜日の同時刻:2 of 3 weeks ago