資料治理通用校驗規則
阿新 • • 發佈:2021-12-15
資料治理#
資料質量規則#
目的#
資料治理分析的重要前提是有資料且有正確的資料可以提供分析。資料質量的把控,應是後續工作的重中之重。為資料探勘、預測、資料分析演算法的合理使用、多維查詢、即席分析、資料視覺化等工作做好支撐,讓資料質量不再是空中樓閣。資料質量不高表現為資料以多種格式,雜亂無序的存在於內外部的各個業務應用系統中,無統一資料來源,資料分析可用的準確資料無法識別,展示資訊不準,很難有效支援領導決策。為形成有效資料資產,要明確資料質量管理目標、控制物件和指標、定義資料質量檢驗規則、執行資料質量檢核,生產資料質量報告。綜上資料質量在資料治理過程中既是前提又是目標,通過資料質量問題處理流程及相關功能實現資料質量問題從發現到處理的閉環管理,從而促進資料質量的不斷提升。
資料質量校驗標準#
- 完整性:完整性用於度量哪些資料丟失了或者哪些資料不可用。
- 規範性:規範性用於度量哪些資料未按統一格式儲存。
- 一致性:一致性用於度量哪些資料的值在資訊含義上是衝突的。
- 準確性:準確性用於度量哪些資料和資訊是不正確的,或者資料是超期的。
- 唯一性:唯一性用於度量哪些資料是重複資料或者資料的哪些屬性是重複的。
- 關聯性:關聯性用於度量哪些關聯的資料缺失或者未建立索引。
需求分析概述#
資料質量通用規則應該做到在不同業務都可以直接使用而不用擔心規則的過度判斷和遺漏。
- 規則分組
通用規則可以放在行業常用規則分組中。 - 規則命名
命名需要體現規則的作用範圍,不可與規則SQL表示式有衝突。 - 規則評價分類
規則評價分類選擇系統預定義規則評估分類型別。 - 規則權重
通用規則在質量評價中的等級,分為:一般、警告和阻斷。 - 規則SQL表示式
質量規則的定義,一般不要在前面加where,引數使用${自然數}表示引數。 - 引數配置
定義引數型別,有當前模型指標項、字元、數值、時間等。
資料質量規則評審#
通過SQL表示式找出不符合規則的資料,通用規則既要考慮結果的準確性還要考慮處理過程的可行性、時間成本、空間成本、不同規則是否滿足業務不相關等因素。
評審內容 | SQL表示式 | 描述 | 引數 |
---|---|---|---|
非空校驗 | ${1} is null | 當前模型欄位為空的欄位 | ${1}:欄位 |
值域校驗 | left outer join ${1} t on ${2} = t.${3} and t.${3} is null WHERE ${2} IS NOT NULL AND t.${3} IS NOT NULL | 模型欄位不在碼錶中的資料 | ${1}:碼錶 ${2}:當前模型欄位 ${3}:碼錶欄位 |
大小值校驗 | ${1} > ${2} or ${1} < ${3} | 模型欄位值不某個取值範圍 | ${1}:當前欄位 ${2}:最大值 ${3}:最小值 |
長度校驗 | length(${1}) <> ${2} | 模型欄位長度規範值 | ${1}:欄位 ${2}:長度值 |
唯一性校驗 | group by ${1} having count([DISTINCT] ${1}) > 1 | 找出模型重複資料 | ${1}:當前表主鍵欄位 |
及時性校驗 | datediff(${1},${2}) < 0 | 判斷當前模型時間標識欄位是否是晚於截止日期 | ${1}:欄位 ${2}:截止時間 |
取值範圍約束 | ${1} not in (${2}) | 模型欄位是否在有限的取值範圍內 | ${1}:當前欄位 ${2}:可能的取值列表(如:'01','02') |
數字精確位數 | length(split((case when length(regexp_extract(${1},"([0-9]+\.)([0-9]+)(E-*[0-9]+)",2))=0 then ${1} when length(regexp_extract(${1},"([0-9]+\.)([0-9]+)(E[0-9]+)",2))<=cast(regexp_extract(${1},"(E)([0-9]+)",2) as int) then rpad(regexp_replace(regexp_extract(${1},"([^E]+)",1),"\.",""),cast(regexp_extract(${1},"(E)([0-9]+)",2) as int)+1,"0") when length(regexp_extract(${1},"([0-9]+\.)([0-9]+)(E[0-9]+)",2))>cast(regexp_extract(${1},"(E)([0-9]+)",2) as int) then concat(substr(regexp_replace(regexp_extract(${1},"([^E]+)",1),"\.",""),1,cast(regexp_extract(${1},"(E)([0-9]+)",2) as int)+1),".", substr(regexp_replace(regexp_extract(${1},"([^E]+)",1),"\.",""),cast(regexp_extract(${1},"(E)([0-9]+)",2) as int)+2)) when ${1} regexp "E-" then concat("0.",repeat("0",cast(regexp_extract(${1},"(E)(-)([0-9]+)",3) as int)-1),regexp_replace(regexp_extract(${1},"(.+)(E)",1),"\.","")) else ${1} end), '[.]')[1]) < ${2} | 數精度判斷(為適應科學計數法sql寫法比較長) | ${1}:欄位 ${2}:最小精度 |
電話號手機號碼校驗(11位)碼校驗 | ${1} is null or length(${1}) <> 11 or REGEXP_LIKE(${1}, '^[^1]') | 校驗11位手機號 | ${1}:當前欄位 |
身份證號校驗(18位) | ${1} is null or length(${1})<>18 or regexp_like(substr(${1},1,17), '^[[:digit:]]+$') or substr(${1},7,4) < 1800 or (substr(${1},11,2) < 1 or substr(${1},11,2)>12) or (substr(${1},1,1)7+ substr(${1},2,1)9+ substr(${1},3,1)10+ substr(${1},4,1)5+ substr(${1},5,1)8+ substr(${1},6,1)4+ substr(${1},7,1)2+ substr(${1},8,1)1+ substr(${1},9,1)6+ substr(${1},10,1)3+ substr(${1},11,1)7+ substr(${1},12,1)9+ substr(${1},13,1)10+ substr(${1},14,1)5+ substr(${1},15,1)8+ substr(${1},16,1)4+ substr(${1},17,1)*2)%11 <> ( case when substr(${1},18,1)='1' then '0' when substr(${1},18,1)='0' then '1' when substr(${1},18,1) in ('X','x') then '2' when substr(${1},18,1)='9' then '3' when substr(${1},18,1)='8' then '4' when substr(${1},18,1)='7' then '5' when substr(${1},18,1)='6' then '6' when substr(${1},18,1)='5' then '7' when substr(${1},18,1)='4' then '8' when substr(${1},18,1)='3' then '9' when substr(${1},18,1)='2' then '10' end ) | 二代身份證校驗 | ${1}:當前欄位 |