SSIS中的容器和數(shù)據(jù)流—數(shù)據(jù)轉(zhuǎn)換
對數(shù)據(jù)流來說按照需求將數(shù)據(jù)轉(zhuǎn)換成需要的格式是數(shù)據(jù)操作中的一個關(guān)鍵的步驟。例如想要得到聚合排序后的運算結(jié)果,轉(zhuǎn)換可以實現(xiàn)這種操作。和SQL Server 2000 DTS完全不同,這些操作不需要編寫script,所有的運算都在內(nèi)存中進(jìn)行。添加一個數(shù)據(jù)轉(zhuǎn)換之后,數(shù)據(jù)直接轉(zhuǎn)換成想要的格式然后傳遞給下一個步驟,由于是在內(nèi)存中完成運算操作的,不需要在數(shù)據(jù)庫中建立對象來存儲這些操作函數(shù)。但是當(dāng)需要處理大批量的數(shù)據(jù)時,還是需要建立存儲表或其他對象來處理的。
在data flow面板中拖放一個轉(zhuǎn)換,鼠標(biāo)點住然后拖放綠色連線到一個目的Destination,然后就可以雙擊并編輯這個轉(zhuǎn)換。這部分將從最基本的功能開始講解轉(zhuǎn)換,下一部分將會做一些實驗操作,并在實際盛傳環(huán)境中來使用它。還有一些更高級的轉(zhuǎn)換著這里不會講解,把他們放在下一個隨筆中講解,這些高級的轉(zhuǎn)換包括:
- 修改Dimension
- 透視和逆透視Pivot and Unpivot
- 行數(shù)
- 導(dǎo)入導(dǎo)出列
- 術(shù)語提取和查找
- 模糊分組和匹配
- 數(shù)據(jù)挖掘
- OLE DB命令
其中一些轉(zhuǎn)換不是很復(fù)雜,只是在SSIS沒有UI支持,要想使用它們需要使用Visual Studio中的高級編輯器。
聚合Aggregate
聚合轉(zhuǎn)換可以像T-SQL中的函數(shù)GROUP BY, Average, Minimum, Maximum, 和 Count一樣對數(shù)據(jù)進(jìn)行聚合運算。在圖4-13中可以看到數(shù)據(jù)以O(shè)rderDate,ProductLine分組,對LineTotal做求和操作。這樣產(chǎn)生了三列新的數(shù)據(jù),供其他操作。
圖4-16
在聚合操作編輯器Aggregate Transformation Editor,首先選擇需要進(jìn)行聚合操作的列,然后選中的列將會出現(xiàn)在下面的一個表里面在Output Alias列里面輸入輸出列的別名。例如如果想輸出每個訂單的總量,這里修改為SubTotal,這樣可以更容易的識別出這一列的目的。最重要的以個設(shè)置是在Operation這一列選擇聚合操作。它有一面一些選項。
- Group By:將數(shù)據(jù)按照某列分組
- Average:對數(shù)據(jù)列求和操作
- Count Distinct:對一組數(shù)據(jù)中非空行計算行數(shù)
- Count Distinct:對一組數(shù)據(jù)中的非空行計算非重復(fù)的行數(shù)
- Minimum:對一組數(shù)據(jù)中的數(shù)字列求最小值
- Maximum:對一組數(shù)據(jù)中的數(shù)字列求最大值
- Sum:對一組數(shù)據(jù)中的數(shù)字列求和
點擊Advanced標(biāo)簽界面,在這個界面可以編輯轉(zhuǎn)換輸出。在Advanced界面可以輸入聚合計算的名字,產(chǎn)生一個新的列。在Advanced標(biāo)簽界面,最關(guān)鍵的選擇項是設(shè)置轉(zhuǎn)換時的緩存,使它在一個合適的水平。例如較低水平設(shè)置為500000條,中等水平設(shè)置為5000000條,較高水平設(shè)置為25000000條。也可以使用Number of Keys屬性設(shè)置具體數(shù)值。Auto Extend Factor屬性設(shè)置轉(zhuǎn)換可以使用的內(nèi)存量,默認(rèn)的值是25%,也可以設(shè)置其他選項保證RAM占用量。Warn On Division by Zero單選框用來處理求平均值時被除數(shù)是0,如果沒有選擇,轉(zhuǎn)換失敗將不會給出任何提示。
審核轉(zhuǎn)換
審核轉(zhuǎn)換允許對數(shù)據(jù)流添加審核審核數(shù)據(jù),以往使用HIPPA和Sarbanes-Oxley (SOX)時,必須跟蹤誰在什么時插入數(shù)據(jù),審核轉(zhuǎn)換可以實現(xiàn)這種功能。例如要跟蹤那一個task向表里插入數(shù)據(jù),可以在審核轉(zhuǎn)換中添加相應(yīng)的列。在Output Column Name列中輸入想要審核的列,在Audit Type內(nèi)選擇審核類型如圖4-17,可以選擇的類型有:
- Execution Instance GUID:GUID標(biāo)示是那一個package執(zhí)行的插入操作
- PackageID:package的唯一標(biāo)示
- PackageName:package的名字
- VersionID:package的GUID的版本
- ExecutionStartTime:package開始執(zhí)行的時間
- MachineName:package所在的機器名
- UserName:啟動package的用戶
- TaskName:數(shù)據(jù)流中task的名字
- TaskID:包含轉(zhuǎn)換task的Data Flow Task的名字
圖4-17
#p#
字符映射
特征映射轉(zhuǎn)換如圖4-18展示數(shù)據(jù)流中列的特征,它的編輯界面很簡單,只有一個標(biāo)簽界面,點擊要進(jìn)行映射的列,可以選擇需要添加新列或需要更新的列??梢栽贠utput Alias列中給原來的列一個別名,選擇要進(jìn)行的操作,可以進(jìn)行的操作類型有:
- Byte Reversal:逆轉(zhuǎn)數(shù)字位的順序,例如數(shù)據(jù)0x1234 0x9876的逆轉(zhuǎn)結(jié)果是0x4321 0x6789,這種操作和LCMapString,LCMAP_BYTEREV選項有相同的操作結(jié)果
- Full Width:將半長字符轉(zhuǎn)換成全長
- Half Width:將全長字符轉(zhuǎn)換成半長
- Hiragana:將日語中的片假名轉(zhuǎn)換成平假名
- Katakana:將日語中的平假名轉(zhuǎn)換成片假名
- Linguistic Casing:使用區(qū)域語言規(guī)則
- Lowercase:轉(zhuǎn)換成小寫字符
- Traditional Chinese:將簡體中文轉(zhuǎn)換成繁體中文
- Simplified Chinese:將繁體中文轉(zhuǎn)換成簡體中文
- Uppercase:將字符轉(zhuǎn)換成大寫
條件分割
根據(jù)條件分割數(shù)據(jù)是一個在數(shù)據(jù)流中添加復(fù)雜邏輯的方法,它允許根據(jù)條件將數(shù)據(jù)輸出到其他不同的路徑中。例如,可以將產(chǎn)品中總數(shù)量超過500的輸出到一個路徑,少于500的輸出到另一個路徑。如圖4-19??梢詮纳厦娴膶傩越Y(jié)構(gòu)中拖放一個列或者代碼段,然后根據(jù)邏輯重命名而不是使用默認(rèn)值Case1,還可以編輯輸出列的名字。
圖4-19
可以使用表達(dá)式來讀取字符數(shù)據(jù),設(shè)置判斷條件,例如下面表達(dá)式判斷城市名字的第一個字符是F,SUBSTRING(City,1,1) == "F"。將這個轉(zhuǎn)換連接到下一個其他轉(zhuǎn)換的時候會彈出一個對話框提示選擇數(shù)據(jù)輸出路徑,如圖4-20.在這個圖中,可以看到有兩個選擇,GoodSales輸出到一個路徑,其他輸出到另一個路徑。還可以新建其他的路徑以供選擇。
圖4-20
如果有兩個選擇,一個默認(rèn)選擇適用于其他情況,路徑如圖4-21
圖4-21
#p#
復(fù)制行
復(fù)制行轉(zhuǎn)換時一種很簡單的轉(zhuǎn)換,它將某一列的數(shù)據(jù)復(fù)制一份克隆。這種操作在執(zhí)行某些精確的轉(zhuǎn)換之前先創(chuàng)建一份拷貝時非常有用。然后將可以對照拷貝數(shù)據(jù)修正源數(shù)據(jù)。雙擊打開編輯界面,選擇要拷貝的列,并重新命名。注意:有些轉(zhuǎn)換允許將一列數(shù)據(jù)復(fù)制到內(nèi)在列里。
數(shù)據(jù)轉(zhuǎn)換
數(shù)據(jù)轉(zhuǎn)換執(zhí)行類似于T-SQL中的函數(shù)CONVERT或CAST的功能。數(shù)據(jù)轉(zhuǎn)換的編輯界面如圖4-22,選擇需要轉(zhuǎn)換的列,在DataType下拉列表中選擇需要的數(shù)據(jù)類型。Output Alias欄內(nèi)設(shè)置輸出時使用的別名。
圖4-22
#p#
數(shù)據(jù)挖掘請求
數(shù)據(jù)挖掘請求運行數(shù)據(jù)挖掘請求,并將結(jié)果輸出到數(shù)據(jù)流。它還可以添加一些預(yù)測新列,一些應(yīng)用場合如下列舉:
- 根據(jù)已知的一些列,例如子女個數(shù),家庭收入,配偶收入預(yù)測產(chǎn)生一個新列:這個人是否擁有住房
- 根據(jù)客戶購物卡預(yù)測客戶的購買意向
- 可以填充用戶的調(diào)查問卷上沒有填寫的空白欄
派生列
導(dǎo)出列任務(wù)可以從從另一個輸出中創(chuàng)建一個新的列。例如,是訂單數(shù)量和訂單價格相乘導(dǎo)出一個新的列訂單總價格,如圖4-23也可以使用ISNULL函數(shù)填充當(dāng)前時間或者某一天的空白數(shù)據(jù)。這是五個可以代替T-SQL代碼編程的task之一。
圖4-23
#p#
輸出列
輸出列任務(wù)可以沖數(shù)據(jù)流中輸出一副圖片或者一個文件。和其他的轉(zhuǎn)換task不同這種轉(zhuǎn)換不需要一個Destination。如圖4-24打開編輯界面,選擇一個包含文件的列,再選擇一個文件輸出路徑。
圖4-24
另外一個選項這只再次執(zhí)行task的時候文件被刪除或覆蓋,Allow Append選項輸出是否累加到一個已經(jīng)存在的文件中。如果選擇Force Truncate選項,會覆蓋掉已經(jīng)存在的文件。Write BOM選項設(shè)置如果數(shù)據(jù)類型是DT_NTEXT是否寫入字符順序符號。如果沒有設(shè)置Append和Truncate選項,task將執(zhí)行錯誤,錯誤信息類似于下面:
Error: 0xC02090A6 at Data Flow Task, Export Column [61]: Opening the file
"wheel_small.gif" for writing failed. The file exists and cannot be overwritten. If
the AllowAppend property is FALSE and the ForceTruncate property is set to FALSE,
the existence of the file will cause this failure.
輸入列
輸入列和輸出列是一個正好相反的task,他可以將圖片和文本文件輸入到一個數(shù)據(jù)行中,他們的編輯設(shè)置也是類似的。
先到這里,剩下的轉(zhuǎn)換任務(wù)下次隨筆在接著再說。
原文鏈接: http://www.cnblogs.com/tylerdonet/archive/2011/04/11/2012899.html
【編輯推薦】