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