search
大數據上的數據稽查原理和方法介紹(上)

大數據上的數據稽查原理和方法介紹(上)

本次內容將分為上下兩篇介紹數據稽查的原理與方法。本文涉及其概念、處理流程、相關語法開關的簡單介紹。

何為數據稽查

經常參與數據分析的人員知道,在向業務表導入數據時,如果數據清洗做的不徹底,很可能會無意錄入臟數據。這些臟數據的存在將影響數據分析和查詢結果的精確性。為了提高分析準確度,減少由臟數據帶來的誤判和對分析過程的干擾,需要依靠數據稽查功能,對業務表中的數據進行排查控守。

以Inceptor為例,它所採用數據稽核方式是,根據規則將臟數據寫入用戶指定的臟數據表(Log Error Table),在該表中標註每一條臟數據的非法原因,在數據導入完成後,返回總記錄數、導入記錄數的介面、數據質量報告,以方便監控程序對臟數據進行判斷與處理,或者列印出顯示報錯信息。這些特性都是為了使數據稽查能夠在臟數據存在的情況下儘可能的保護系統或保證業務的順暢執行。

記錄哪些臟數據類型

Inceptor開啟數據稽查后,系統將對具有如下問題的數據進行報錯並記錄至Log Error Table:

  • 字元串中含有定界標識符,導致一行數據被誤讀為多行。試想,若欄位值中存在定界標識符,讀入記錄的欄位數將與定義數量相違。對於這種情況,系統將通過判斷欄位總數是否和定義一致來識別。

  • 以目標表的類型為準,進行類型匹配與類型轉換,如果數據源的類型無法轉換為目標類型,則被視為臟數據。

  • 在通過UDF結合過濾條件,實現數據轉換以及過濾時,對類型不匹配的數據列印報錯或記錄於Log Error Table。

  • 對不符合NOT NULL限制的記錄報錯。

數據稽查的處理流程

完整的數據稽查功能按照如下的處理流程實現,建議在使用數據稽查功能以及設置相關配置時,結合該流程決定相關參數值:

  • 在創建一個外表的同時指定Log Error Table(目前Inceptor的數據稽查僅可作用於外表)。

  • 當通過查詢語句訪問該外表數據時,每解析一行記錄,若所得數據為上述四種無效數據之一,就將該行寫入Log Error Table。

  • 允許指定REJECT策略,即當錯誤率達到一定的行數或者比例時,就停止數據讀取。

Inceptor數據稽查相關語法

指定Log Error Table

需要在創建外表時為其指定Log Error Table。

CREATE EXTERNAL TABLE table_name (column1 datatype1, column2 datatype2, ...) LOG ERRORS INTO error_table_name [OVERWRITE] [SEGMENT REJECT LIMIT n [ ROWS | Percent ] ]

  • error_table_name是Log Error Table的名稱,若不存在系統將自動創建。只允許在創建表時指定。注意關鍵字LOG ERRORS INTO。

  • 若每次錯誤信息都重寫覆蓋Log Error Table,需在語法相應位置寫「OVERWRITE」,否則忽略。使用Overwrite的好處是能追溯至更久遠的信息,但壞處是每次都會在原有記錄的基礎上增加內容,使該Log Error Table不斷擴增。

  • 若需執行REJECT策略,應補充「SEGMENT REJECT LIMIT n…」部分,如果沒有需求就忽略。n是REJECT閾值,表示停止讀入之前允許的非法數據最大行數或比例。應注意,分散式結構下,由於語句的執行是分配至不同task實現的,此時n是相對於一個task中的數據行數而言的,而並非總數據行數。

  • 沒有指定Log Error Table的表也可以受到數據稽查的保護,只是錯誤信息不會收錄於Log Error Table。

  • 指定了Log Error Table並不代表啟動了數據稽查,需要通過後面將介紹的開關控制。

例. 創建外表指定關聯的Log Error Table

創建employee表,導入employee.txt中的記錄。employee.txt的內容如下:

指定employee表的Log Error Table為employee_error_table,允許Overwrite,採用LIMIT=2的Reject策略,即task訪問臟數據大於兩行時就停止執行。創建語句如下:

以下為「SELECT * FROM employee」的結果

可以發現這其中有三行記錄涉及臟數據:

1行和10行的age欄位無法由源數據的字元串類型轉為整型,因此顯示為NULL。

11行的id欄位為空,但是在定義時我們對id做了NOT NULL限制,因此非法。

後面會講到數據稽查如何對它們做處理。

控制開關

下面是和數據稽查相關的三個開關,用於控制其工作特性:

1. SET inceptor.data.audit = true/false;

數據稽查總開關,開啟時會做臟數據和NOT NULL檢查,默認關閉。

2. SET inceptor.strict.evaluate = true/false;

是否在遇到臟數據時報Exception,默認關閉。

3. SET inceptor.notnull.audit = true/false;

是否對NOT NULL Constraint進行檢查,默認關閉。

上述三個開關之間有如下關係:

inceptor.data.audit設為true后,後面兩個開關強製為true,啟動inceptor.data.audit之後再對兩個子開關進行設置將不起作用。

后兩個開關可以在inceptor.data.audit關閉時做設置。區別在於,如果開啟inceptor.data.audit,關於臟數據和NOT NULL限制的報錯都會寫入Log Error Table;若在關閉inceptor.data.audit后啟動inceptor.strict.evaluate或inceptor.notnull.audit,檢測到的報錯將被列印於界面。

例1.開inceptor.data.audit的範例

① 總開關打開后,發現SELECT * FROM employee僅返回了合法數據。此後,查詢語句都將只訪問合法數據。

② 稽查只考慮當前查詢語句所涉及的欄位。例如,雖然①返回8條結果,此語句返回age欄位中的合法值有9個。這是因為,count(age)只會顧及age欄位的合法值,雖然第11行引入了臟數據,但是它的age欄位確實是合法的。

③ 總共有三行臟數據錄入Log Error Table。

以上行為都符合Inceptor數據稽查的設定。

例 2. 關inceptor.data.audit,開inceptor.strict.evaluate的範例

關閉inceptor.data.audit,開啟inceptor.strict.evaluate后,Inceptor將對訪問到的臟數據報Exception,並不會記錄於Log Error Table。

總結

數據稽查作為臟數據過濾器,它不僅可以保證查詢語句僅訪問有效乾淨的數據,而且為修正臟數據提供線索,實現了臟數據和健康數據之間的隔離。因此在保障語句順利執行,確保分析結果正確性方面具有重要的意義和作用。若能熟練掌握數據稽查的使用和控制方法、用於臟數據修正,定會使數據可靠性的高度更升一級。

下次我們將繼續圍繞數據稽查,介紹如何修改它的屬性,會帶來什麼影響,以及如何閱讀Log Error Table的內容,和它的許可權控制方法。

————————

關於:此文由公眾號大數據開放實驗室原創

大數據開放實驗室由星環信息科技(上海)有限公司運營,專門致力於大數據技術的研究和傳播。若轉載請在文章開頭明顯註明「文章來源於微信訂閱號——大數據開放實驗室」,並保留作者和賬號介紹。

————————

熱門推薦

本文由 一點資訊 提供 原文連結

一點資訊
寫了5860316篇文章,獲得23313次喜歡
留言回覆
回覆
精彩推薦