この JSON 仕様は、DataWorks のデータ品質モニタリングルールとリソースを定義します。DataWorks API 操作を呼び出してデータ品質ルールを作成および管理する際に、リクエストパラメーターとして使用します。
基本的な定義
例
以下は、テーブルの行数を検証する簡単なデータ品質ルールの例です。
{
"datasets": [
{
"type": "Table",
"tables": [
"tb_d_spec_demo"
],
"dataSource": {
"name": "odps_first",
"envType": "Dev"
}
}
],
"rules": [
{
"assertion": "row_count > 0"
}
]
}設定リファレンス
この例では、以下のプロパティを持つ基本的なデータ品質モニタリングルールを定義しています。
datasets: 監視するデータオブジェクト。各データセットには以下が含まれます:type: 監視するオブジェクトタイプ。現在、Tableのみがサポートされています。dataSource: データを含むデータソース。nameおよびenvTypeパラメーターを設定してデータソースを識別できます。データソース名を取得するには、ListDataSources 操作を呼び出します。説明現在、一部のデータソースのみがサポートされています。詳細については、「サポートされているデータソースタイプ」をご参照ください。
tables: 監視するテーブル名 (typeがTableの場合に必須)。説明データソースがデータベースレベルで接続されており、デフォルト以外のスキーマのテーブルを監視する必要がある場合は、
schema.tableのフォーマットを使用します。
rules: データが満たすべき検証ルール。各モニタリング設定には複数のルールを含めることができます。検証の仕組み:
システムは監視対象オブジェクトのデータをスキャンします。
各ルールのメトリック値を計算します。
定義されたしきい値と値を比較します。
以下の 3 つのステータスのいずれかを返します:
pass: メトリック値が許容されるしきい値の範囲内です。
fail: メトリック値がしきい値の範囲外です。
error: 検証で例外が発生しました (例: 構文エラー)。
warnしきい値を定義すると、検証はwarnステータスを返すこともあります。詳細については、「複数レベルのしきい値定義」をご参照ください。assertion文で使用可能なメトリックタイプについては、「サポートされている組み込みメトリックタイプ」をご参照ください。また、カスタムメトリックルールを作成することもできます。
しきい値のタイプ
以下のいずれかのメソッドを使用してしきい値を定義します:
静的しきい値
メトリックを固定値と直接比較します。
メトリック
引数 (オプション)
比較記号 (オプション)
しきい値 (オプション)
例
{
"rules": [
{
// テーブルにはデータが含まれている必要があります
"assertion": "row_count > 0"
},
{
// Size フィールドの最大値は 500 を超えてはなりません
"assertion": "max(size) <= 500"
}
]
}式の内訳:
式の部分 |
|
|
メトリック |
|
|
引数 (オプション) |
| |
比較記号 (オプション) |
|
|
しきい値 (オプション) |
|
|
利用可能なオペレーターの詳細については、「サポートされている比較オペレーター」をご参照ください。
変動しきい値
現在のメトリックを過去のベースラインと比較して異常を検出します。
ユースケース:
1 日のユーザー数は昨日から 100 を超えて変動してはなりません
今日の収益は、7 日間の平均から 10% を超えて変動してはなりません
通常、変動しきい値を定義するには、metric の前に change for を追加します。変動しきい値の定義には、次の部分が含まれます:
change (キーワード)
集計タイプ (オプション)
タイムウィンドウ (オプション)
percent (キーワード、オプション)
for (キーワード)
メトリック
引数 (オプション)
比較記号 (オプション)
しきい値 (オプション)
式のフォーマットは change [aggregate_type] [time_window] [percent] for metric [argument] [comparison_symbol threshold] です。
例 1: 最後のチェックとの比較
{
"rules": [
{
// 前回の検証からの行数の変更は 10,000 以内でなければなりません
"assertion": "change for row_count < 10000"
}
]
}例 2: 特定のタイムウィンドウとの比較
比較対象の過去のメトリックを指定します:
{
"rules": [
{
// 7 日前からの行数の変更は 10,000 以内でなければなりません
"assertion": "change 7 days ago for row_count < 10000"
}
]
}例 3: 集計された過去の値との比較
比較前に過去のデータを集計します:
{
"rules": [
{
// 7 日間の平均からの行数の変更は 10,000 以内でなければなりません
"assertion": "change average last 7 days for row_count < 10000"
}
]
}サポートされている集計方法:
avg: 平均値。
var: 分散。
集計方法を省略すると、システムは各過去のレコードと個別に比較し、最も深刻なステータスを返します。
例 4: パーセンテージベースの変動
比較前にパーセンテージの変化を計算します:
{
"rules": [
{
// 前回のチェックからの行数のパーセンテージ変化は 50% 以内でなければなりません
"assertion": "change percent for row_count < 50%"
}
]
}パーセンテージの計算: 現在の値 c と以前の値 p が与えられた場合、percent = (c - p) / p となります。エッジケース:
両方の値が 0 の場合: パーセンテージ = 0。
以前の値が 0 で現在の値が 0 でない場合: 検証は
errorを返します。
%記号はオプションですが、可読性を向上させます結果は負になることがあります。範囲構文を使用して、許容される変動帯を定義します。
範囲しきい値
区間表記を使用して、許容される値の範囲を定義します。
閉区間 (デフォルト)
両方の境界が含まれます:
{
"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 between 10 and 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": "row_count between (10 and 15"
}, {
"assertion": "row_count between (10 and 15)"
}
]
}明示的な区間境界
閉じた境界には角括弧 [ ] を使用します:
[10, 15]
[10, 15)
(10, 15]
[10, 15]
{
"datasets": [
{
"type": "Table",
"tables": [
"tb_d_spec_demo"
],
"filter": "dt='$[yyyymmdd]' AND hh='$[hh24-1/24]'",
"dataSource": {
"name": "odps_first"
}
}
],
"rules": [
{
"assertion": "row_count between 10 and 15"
}, {
"assertion": "row_count between [10 and 15"
}, {
"assertion": "row_count between 10 and 15]"
}, {
"assertion": "row_count between [10 and 15]"
}
]
}複数レベルのしきい値定義
アサーションにしきい値を埋め込む代わりに、warn と fail のしきい値を別々のプロパティとして定義します:
{
"rules": [
{
"assertion": "duplicate_count(phone)",
"warn": "when between 1 and 10",
"fail": "when > 10"
}
]
}上記のコードスニペットは、warn と fail の 2 つのしきい値レベルを定義しています:
phoneフィールドの重複行数が0の場合、チェックは成功します。phoneフィールドの重複行数が 10 より大きい場合、チェック結果はfailになります。phoneフィールドの重複行数が 1 から 10 の間の場合、チェック結果はwarnになります。
配列ベースのしきい値
各重要度レベルに対して複数の条件を定義します:
{
"rules": [
{
"assertion": "duplicate_count(phone)",
"warn": [
"when > 2",
"when < 0"
]
}
]
}重複数が 2 より大きいか 0 より小さい場合、warn しきい値がトリガーされます。
重複するしきい値
しきい値の範囲が重複する場合、システムは最も深刻なステータスを返します。
区間の補集合
not between...and... を使用して、区間外の許容範囲を定義します:
{
"rules": [
{
"assertion": "duplicate_count(phone)",
"warn": "when not between -10 and 10",
"fail": "when not between -20 and 20"
}
]
}視覚的な表現:
ルール識別子
ルールに identify を指定して、そのグローバルに一意な識別子として機能させることができます。
ルール作成時に
identifyを指定しない場合、システムは自動的にルールにidを割り当てます。identifyがグローバルに一意であることを確認する必要があります。そうしないと、更新が失敗したり、誤って他のルールを更新したりする可能性があります。uuidを使用することをお勧めします。変動しきい値ルール (
change...for...) および外れ値検出ルール (anomaly detection for ...) の場合、システムはルールのidentifyに基づいてチェック履歴をクエリします。システムが Data Quality モニタリングルールの更新リクエストを受信すると、次のようにリクエストを処理します:
まず、システムは更新リクエスト内の各ルールを走査し、ルールの
idを使用して Data Quality モニタリング設定内の既存のルールを照合および更新します。システムは、リクエスト内に一致する
idがない Data Quality モニタリング設定内の既存のルールを削除します。システムは、更新リクエストから残りのルールを Data Quality モニタリング設定の新しいルールとして作成します。
次の例は、identify を指定する方法を示しています:
{
"rules": [
{
"assertion": "row_count > 0",
"name": "Number of data rows is greater than 0",
// グローバルに一意な識別子を指定します。
"identify": "3de219e2-cb3c-4e3c-bff0-15f607c641f2"
}
]
}ビジネスの重要度レベル
ビジネスへの影響の重要度でルールをタグ付けします:
{
"rules": [
{
"assertion": "row_count > 0",
"severity": "High"
}
]
}サポートされているレベル:
高
通常 (デフォルト)
ルールの有効化または無効化
設定を削除せずにルールの実行を制御します:
{
"rules": [
{
"assertion": "row_count > 0",
"enabled": false // 検証中にルールは実行されません
}
]
}予備 SQL 文
メトリック計算の前に SET 文を実行します:
{
"rules": [
{
"assertion": "row_count > 0",
"settingConfig": "SET odps.sql.udf.timeout=600s; SET odps.sql.python.version=cp27;"
}
]
}問題のあるデータの保持
検証の失敗を引き起こした行を自動的に保存します:
{
"rules": [
{
"assertion": "duplicate_count(phone) = 0",
"collectFailedRows": true
}
]
}検証が warn または fail を返した場合、システムは問題のある行をフィルター処理し、同じデータベース内の別のテーブルに保存します。
カスタム SQL ルールの場合、フィルタークエリを明示的に定義します:
{
"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"
}
]
}データ保持でサポートされているメトリック:
missing_count
missing_percent
duplicate_count
duplicate_percent
distinct_count
distinct_percent
ルール名と説明
より良い編成のためにメタデータを追加します。これらの値は、検証結果と DataWorks 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": "Number of data rows is greater than 0",
"description": "Output data cannot be empty"
}
]
}データフィルタリング
ルールレベルのフィルター
特定のルールにフィルターを適用します:
{
"rules": [
{
"assertion": "row_count > 0",
"filter": "id IS NOT NULL"
}
]
}データセットレベルのフィルター
モニタリング設定のすべてのルールにグローバルにフィルターを適用します:
{
"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"
}
]
}この例では、時間式 $[yyyymmdd-1] を使用しています。検証の実行時に、システムはこれを 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
タイムウィンドウの構文
これらのフォーマットを使用して、過去の比較期間を定義します:
n タイムユニット前:
n (minute[s]|hour[s]|day[s]|week[s]|month[s]) ago。例には、n months ago、n days ago、n hours agoが含まれます。1 日前: 1 day ago
7 日前: 7 days ago
1 か月前: 1 month ago
8 時間前: 8 hours ago
15 分前: 15 minutes ago
最後の期間:
last n (minute[s]|hour[s]|day[s]|week[s]|month[s]) [with interval m (minute[s]|hour[s]|day[s]|week[s]|month[s])]。例には、the last 15 minutes、the last 7 days、the last 1 monthが含まれます。過去 15 分間: last 15 minutes
過去 24 時間、1 時間ごとに 1 つのデータポイントを収集: last 24 hours with interval 1 hour
説明データポイントは、現在の時刻の 24 時間前から現在の時刻まで、1 時間ごとに収集されます。
過去 7 日間: last 7 days
過去 1 か月間: last 1 month
月内の特定の日または週内の特定の曜日の同じ時刻:
1/2/3/.../-3/-2/-1 of (current|last|n) (months|weeks) (ago)当月の 1 日の同じ時刻: 1 of current month
先月の最終日の同じ時刻: -1 of last month
3 週間前の火曜日の同じ時刻: 2 of 3 weeks ago
`n` 個のタイムウィンドウの連結:
time window and time window [and time window]1 日前、7 日前、1 か月前、および当月の 1 日: 1 day ago and 7 days ago and 1 month ago and 1 of current month