在資料品質監控情境中,通常不會將整張表的資料都納入監控,而是每次監控只過濾出發生變動的資料,本文介紹如何設定資料過濾。
資料過濾配置樣本
大部分情境中,發生變動的資料都是基於時間欄位來過濾。例如在MaxCompute中,會使用時間分區來過濾;在MySQL業務流水表情境中,會根據業務流水的建立時間過濾。
您可以在監控和規則中設定filter來實現資料過濾,配置樣本:
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"
# 在規則層級添加filter,會與Scan.dataset中的filter共同起作用
# 實際執行時的filter會是 (dt = '$[yyyymmdd-1]' AND hh = '$[hh24-1/24]') AND (id IS NOT NULL)
filter: "id IS NOT NULL"
computeResource:
id: 2001filter文法說明
基本文法
filter文法與SQL-92標準的WHERE條件寫法基本保持一致(除去match、overlaps兩種謂詞),具體的文法格式如下:
<search condition> ::=
<boolean term> | <search condition> OR <boolean term>
<boolean term> ::=
<boolean factor> | <boolean term> AND <boolean factor>
<boolean factor> ::=
[ NOT ] <boolean test>
<boolean test> ::=
<predicate> | ( <search condition> )
<predicate> ::=
<comparison predicate> | <between predicate> |
<in predicate> | <like predicate> | <null predicate> |
<quantified comparison predicate> | <exists predicate>
<comparison predicate> ::=
<expression> <comparison_operator> <expression>
<between predicate> ::=
<expression> [NOT] BETWEEN <lower_bound> AND <upper_bound>
<in predicate> ::=
<expression> [NOT] IN (value_list | subquery)
<like predicate> ::=
<expression> [NOT] LIKE pattern [ESCAPE escape_character]
<null predicate> ::=
<expression> IS [NOT] NULL
<quantified comparison predicate> ::=
<expression> <comparison_operator> { ALL | ANY | SOME } (subquery)
<exists predicate> ::=
EXISTS (subquery)配置樣本
comparison predicate
salary > 50000between predicate
price BETWEEN 10 AND 50in predicate
department IN ('Sales', 'Marketing')like predicate
name LIKE 'Jo%'null predicate
department IS NOT NULLquantified comparison predicate
salary > ALL (SELECT salary FROM employees WHERE department = 'Sales')exists predicate
EXISTS (SELECT 1 FROM customers cu WHERE cu.country_id = c.country_id)較複雜的search condition
-- 使用AND邏輯操作符串連兩個predict salary > ALL (SELECT salary FROM employees WHERE department = 'Sales') AND EXISTS (SELECT 1 FROM customers cu WHERE cu.country_id = c.country_id) -- 使用OR邏輯操作符串連 department IS NOT NULL OR name LIKE 'Jo%'
使用原生的query定義Filter
如果底層資料存放區的查詢語句無法用SQL-92標準的SQL轉化(例如使用了RLIKE、地理位置搜尋、全文檢索搜尋等特性),則可以在filter中以query:關鍵字開頭,直接寫原生的query。
例如,使用RLIKE對MaxCompute表的資料進行過濾,配置樣本如下:
datasets:
- type: Table
indices:
- ods_d_customers
dataSource:
name: odps_first
envType: Dev
rules:
- assertion: "row_count > 0"
filter: "query: email_address RLIKE '^info@'"filter中使用時間變數
如果使用時間分區,品質監控每天會掃描當天的分區或者T-1的分區,此時需要每天執行品質監控時自動擷取到對應的日期值,您可以使用調度系統的時間位移運算式寫法。
例如,在filter中使用了類似$[yyyymmdd-1]的調度時間運算式寫法,資料品質系統會自動以調度執行個體的定時時間為基準做位移並替換。
如果資料品質監控不是通過調度執行個體觸發的,需要在CreateDataQualityScanRun的觸發參數中指定triggerTime,系統會以triggerTime為基準做位移,