資料庫使用SSIS進行資料清洗教程

2021-09-16 11:53:53 字數 2087 閱讀 1341

oltp系統的後端關聯式資料庫用於儲存不同種類的資料,理論上來講,資料庫中每一列的值都有其所代表的特定含義,資料也應該在存入資料庫之前進行規範化處理,比如說「age」列,用於儲存人的年齡,設定的資料型別為int型別。存入資料庫的值是2000雖然看起來沒有任何問題,但結合業務規則,這樣的」noisy」資料在資料分析過程中就會造成資料分析的結果嚴重失真,比如極大的拉高平均年齡。在真實的oltp系統中,這類不該存在的資料往往會由於各種各樣的原因大量存在,類似這種型別的資料都會在資料進入資料倉儲之前,在預處理階段進行清洗。

上面舉出的簡單例子僅僅是乙個違反業務規則的情況,但實際的情況會根據具體業務的不同而不同,並不是乙個簡單統一的過程就能夠解決,文字列舉了一些典型的需要資料清洗的場景和ssis中的實現方式。

為什麼不使用sql語句進行處理?

使用sql語句來查詢和處理這類問題是可行的,但使用sql語句有其侷限性,例如:

假如資料來源不是關聯式資料庫呢?

假如業務邏輯非常複雜,需要非常複雜的sql語句呢,處理過程中的除錯、日誌如何處理?

使用ssis可以很好的解決上述問題,ssis提供了基於圖的資料流,並在處理過程中提供了除錯、日誌、檢視轉換中的資料的能力,並且ssis包相較於sql更適合於團隊作業。

使用ssis進行資料清洗

下面是一些典型的資料清理作業,使用ssis進行處理。

缺失預設值

缺失預設值是最常見的一種需要資料清洗的一種情況,缺失預設值指的是資料庫列中的值為「null」,而在資料分析中,該類為null的資料需要替換中符合業務邏輯的值,比如null出現在銷售地區列可以替換成「其他」,出現在銷售資料列可以替換成「未知」等。

在ssis中我們可以通過「派生列」任務來為缺失預設值的列新增預設值,本例中我們對adventureworks示例資料庫的person.address資料庫的addressline2列進行替換,該列中為null的值我們統一替換成「無附加位址」,如圖1所示。

除了上述使用常量替換null值之外,我們也可以按照業務規則根據其他資料來源的資料填補null值,圖2中的例子是productcosthistory表中部分enddate列為null,通過查詢product表的modifieddate列將為null的enddate列中的值補全。

語義轉換

有時候,某些列的值需要做語義上的轉換,比如說某個產品的產地列為5,分析時很難知道5代表什麼,因此可以去對應的表或檔案進行查詢來替換這個5,比如5代表河北。在ssis中,實現該類轉換可以類似圖2中直接去表中查詢,也可以為該查詢表(5代表河北這張表)建立快取,然後通過快取進行引用查詢。

為了實現通過快取做語義轉換,我們首先設定兩個步驟,第一步首先將查詢表的資料匯入快取,第二步再對快取進行查詢從而實現語義轉換。

首先將查詢表的資料匯入快取,如圖4所示。

然後通過快取更新資料,如圖5所示。

資料型別轉換

當資料來自不同資料來源時,不同型別的資料來源資料型別不相容可能導致報錯。在ssis中,可以使用「派生列」來實現資料轉換,派生列允許寫自定義公式實現比較複雜的轉換,也可以通過資料轉換任務實現簡單的資料型別轉換,從而使得不同資料來源的資料相容。如圖6所示。

資料截斷問題

某些情況下,資料可能在傳輸過程中由於資料長度的限制導致資料截斷,在ssis中的解決辦法是將截斷或者出錯的資料匯入到乙個中間表中待進一步處理,如圖7所示。

在oledb源的配置如圖8所示。

查詢匹配失敗

在某些情況下,將多個資料來源中的資料進行整合時,同乙個語義的資料可能以不同的方式儲存,比如一些資料來源存的值為「北京」,而另一些資料來源存的為「北京市」。解決該類問題的辦法就是「模糊查詢」任務。如圖9所示。

在圖9中,我們對資料進行了模糊查詢,設定匹配度大於0.5的為匹配,小於0.5的為不匹配,分別輸出到不同的資料來源中。從而幫助資料進行了統一。

違反業務規則

在設計資料倉儲時,很重要的一點是列中何種型別的值是合適的。比如值是否在業務範圍之內,或者列中資料與其相關的資料結合是否有效(比如說結束日誌不能小於開始日誌)。對於該類資料匯入到目標表之前應該進行清理,在ssis中清洗的方式有很多,比如使用「有條件拆分」任務將不符合業務規範的資料進行剔除或處理,或匯入stage表。這取決於業務型別。

小結本文簡述了資料清洗的概念,並對一些常見的資料清洗場景進行了實現。使用ssis進行資料清洗相較於其他方式有很大的靈活性和效能。

使用SSIS進行資料清洗

原文 使用ssis進行資料清洗 oltp系統的後端關聯式資料庫用於儲存不同種類的資料,理論上來講,資料庫中每一列的值都有其所代表的特定含義,資料也應該在存入資料庫之前進行規範化處理,比如說 age 列,用於儲存人的年齡,設定的資料型別為int型別。存入資料庫的值是2000雖然看起來沒有任何問題,但結...

使用SSIS進行資料清洗

oltp系統的後端關聯式資料庫用於儲存不同種類的資料,理論上來講,資料庫中每一列的值都有其所代表的特定含義,資料也應該在存入資料庫之前進行規範化處理,比如說 age 列,用於儲存人的年齡,設定的資料型別為int型別。存入資料庫的值是2000雖然看起來沒有任何問題,但結合業務規則,這樣的 noisy ...

使用python進行資料清洗

1 在資料清洗前,我們需要先檢視資料概況,了解我們需要清洗的資料大概包含什麼字段 每個字段下面資料範圍大概如何,資料清洗常用到的函式和語法分別有 info函式 用於了解資料總體情況,包括行數,列數,各列名稱等,比如 shape函式 用於檢視資料矩陣的行和列 describe函式 了解datafram...