SSIS 学习(2):数据流任务(上)
?? ? 數(shù)據(jù)流任務(wù)是SSIS中的一個核心任務(wù),估計大多數(shù)ETL包中,都離不開數(shù)據(jù)流任務(wù)。所以我們也從數(shù)據(jù)流任務(wù)學起。
數(shù)據(jù)流任務(wù)包括三種不同類型的數(shù)據(jù)流組件:源、轉(zhuǎn)換、目標。其中:
源:它是指一組數(shù)據(jù)存儲體,包括關(guān)系數(shù)據(jù)庫的表、視圖;文件(平面文件、Excel 文件、Xml 文件等);系統(tǒng)內(nèi)存中的數(shù)據(jù)集等。
轉(zhuǎn)換:這是數(shù)據(jù)流任務(wù)的核心組件,如果說數(shù)據(jù)流任務(wù)是ETL的核心,那么數(shù)據(jù)流任務(wù)中的轉(zhuǎn)換,則是ETL核心中的核心了。它包含非常豐富的數(shù)據(jù)轉(zhuǎn)換組件,比如數(shù)據(jù)更新、聚合、合并、分發(fā)、排序、查找等。可以說SQL語句中有的功能,它都基本上運用起來了。
目標:與“源”相對應(yīng),也是一組數(shù)據(jù)存儲體。包含表、視圖;文件;多維數(shù)據(jù)集、內(nèi)存記錄集等。
? 除以上三類組件外,還有一種組件,那就是”流(Flow)“,它形象地顯示了數(shù)據(jù)從”源“,經(jīng)過”轉(zhuǎn)換“,最后到達”目的“地的一組路徑。我們可以利用”流“,來查看數(shù)據(jù),添加備注說明等。
下面一幅圖,就充分展示了源、轉(zhuǎn)換、目的、流的關(guān)系。
?
下面我們以將IIS Log 導入數(shù)據(jù)庫為例,來介紹如何進行數(shù)據(jù)流任務(wù)開發(fā)。
在開發(fā)之前,我們先來看看IISlog 的結(jié)構(gòu),如圖:
它基本上記錄了網(wǎng)頁瀏覽的所有信息,如日期、時間、客戶IP、服務(wù)器IP、頁面地址、頁面參數(shù)等很多信息,我們再根據(jù)這些信息,在關(guān)系型數(shù)據(jù)庫中,建立一張對應(yīng)表,來記錄這些信息。?
代碼 CREATE?TABLE?[dbo].[IisLog](????[c_Date]?[datetime]?NULL,
????[c_Time]?[varchar](10)?NULL,
????[c_Ip]?[varchar](20)?NULL,
????[cs_Username]?[varchar](20)?NULL,
????[s_Ip]?[varchar](20)?NULL,
????s_ComputerName?varchar(30)?null,
????[s_Port]?[varchar](10)?NULL,
????[cs_Method]?[varchar](10)?NULL,
????[cs_Uri_Stem]?[varchar](500)?NULL,
????[cs_Uri_Query]?[varchar](500)?NULL,
????[sc_Status]?[varchar](20)?NULL,
????sc_SubStatus?varchar(20)?null,
????sc_Win32_Status?varchar(20)?null,
????sc_Bytes?int?null,
????cs_Bytes?int?null,
????time_Taken?varchar(10)?null,
????cs_Version?varchar(20)?null,
????cs_Host?varchar(20)?null,
????[cs_User_Agent]?[varchar](500)?NULL,
????[cs_Refere]?[varchar](500)?NULL
)?ON?[PRIMARY]
?
萬事俱備,下面我們就可以開始ETL的開發(fā)之旅了,打開Visual Studio 2008 工具,[文件]-->[新建]-->[項目],選擇“Integration Services 項目”,ETL 的開發(fā)界面就躍入眼簾,這是從事.Net 開發(fā)的朋友們非常熟悉的界面。打開左邊“工具箱”,將“數(shù)據(jù)流任務(wù)”拖到主窗口“控制流面板”,如圖所示:
然后雙擊“控制流”面板上的“數(shù)據(jù)流任務(wù)”,進入“數(shù)據(jù)流”面板,這兩部分UI沒有什么差異,只是所實現(xiàn)的功能不同罷了。真正的數(shù)據(jù)流任務(wù)開發(fā),從現(xiàn)在才算開始。
打開左邊“工具箱”,可以看到有三大部分:數(shù)據(jù)流源、數(shù)據(jù)流轉(zhuǎn)換、數(shù)據(jù)流目標。我們從“數(shù)據(jù)流源”中,將“平面文件源”拖到主窗口下,雙擊打開“平面文件源”編輯器,點擊“新建”,打開平面文件連接管理編輯器,如圖: ??
輸入連接名稱,選擇IisLog 文件,選擇行分隔符、列分隔符,就可以從預(yù)覽窗口看到數(shù)據(jù)的真面目了。
這里有一點要注意,不同的平面文件,其行分隔符、列分隔符都是不一樣的,如果選不正確,將達不到你想要的效果,所有的數(shù)據(jù)都可能擠到一列中去了。一般行分隔比較簡單,基本上都是以回車換行({CR}{LF})來分隔;列分隔符卻不一樣了,它既可以以任意文本字符來分隔,比如逗號(,)、分號(;)、冒號(:)tab符、豎線(|),以及常用的文字字符、數(shù)字字符,也可以定義每一列的固定寬度來分隔。這就需要視文件源不一樣,分別對待了。
在平面文件連接管理器中,選擇“高級”,還可以定義每一列的列名、數(shù)據(jù)類型、字符長度等信息。 等一切定義完成,點擊確定,返回到平面文件編輯器界面,前面建立的連接將自動返回到“平面文件連接管理器”的下拉列表框中,下面就要以選擇需要輸出的列了,如圖:
?
??? 然后再選擇“錯誤輸出”,缺省選項如下圖所示:
?? ? ?這一選項非常重要,是要求我們配置當源數(shù)據(jù)發(fā)生錯誤的時候該如何處理,一般源數(shù)據(jù)發(fā)生錯誤有兩種情況:一是數(shù)據(jù)類型錯誤,比如日期格式錯誤、數(shù)字變字符了等;另一情況就是字符太長,超出列寬了。根據(jù)不同的情況,其處理方式也不一樣,系統(tǒng)提供了三種解決辦法:
忽略失敗:是指如果某一行數(shù)據(jù)錯誤,忽略此行,不影響程序執(zhí)行,繼續(xù)導入其它數(shù)據(jù)。
重定向行:將錯誤的數(shù)據(jù)行,導入到另外一個數(shù)據(jù)流目標,供以后人工檢查后,再重新處理。
組件失敗:這是最嚴格的,只要遇到數(shù)據(jù)錯誤,組件立即失敗,停止運行。
就IISLOg 這樣的數(shù)據(jù)源文件來說,有錯誤數(shù)據(jù)行,那是是經(jīng)常發(fā)生,但是這些少量數(shù)據(jù)錯誤,也不會影響最終的結(jié)果,我們就要以考慮容錯性為主了,放寬對數(shù)據(jù)質(zhì)量的要求,一般選擇“忽略錯誤”,以方便程序繼續(xù)運行。
???? 一切都定義完后,我們看到“平面文件源”控件上,還有一個紅色的叉(X),那是指沒有為此數(shù)據(jù)源定義目標,那就是下一步要定義的。另外下面還有兩個長線箭頭,一個綠色,一外紅色,其中綠色:表示正確數(shù)據(jù)流通路,紅色表示錯誤數(shù)據(jù)流通路,如果前面定義錯誤“重定向行”,那么錯誤數(shù)據(jù)將沿著紅色路徑,流向錯誤數(shù)據(jù)存放地。
定義數(shù)據(jù)源目標,這可能要簡單一些了,同理從左邊"工具箱"中,看到有很多種類型的數(shù)據(jù)源目標,我們選擇“OLE DB 目標”,將“平面文件源”控件下的綠色箭頭連接到“OLE DB 目標”,然后雙擊,打開“OLE DB 目標編輯器”窗口,“新建”數(shù)據(jù)庫連接,如圖:
?
返回到“OLE DB 目標編輯器”窗口,在數(shù)據(jù)訪問模式下,選擇“表或者視圖--快速加載”一項,然后再選擇對應(yīng)的表,如圖:
下面配置列映射,如圖:
如果沒有的列,直接忽略即可(前提是表中該列允許為空),后面仍然是配置錯誤處理方式,參照平面文件源錯誤處理方式即可。
到此為止,一個簡單的數(shù)據(jù)流任務(wù)就基本上完成了,點擊運行,我們期待已久的結(jié)果出現(xiàn)了。
?
?當然,在實際開發(fā)過程中,可能并沒有這么順利,會遇到很多各種各樣的問題,在這篇文章中我們很少提及,主要是因為這僅是個開始,沒有涉及到這么深入,在以后的專題中,會逐漸講解。
一個簡單的數(shù)據(jù)源任務(wù)就算完成了,其實這只是一個Demo ,讓大家了解了一個概況,可以說萬里長城只是走出了第一步,真正的ETL不會這么簡單。下后面我們將介紹ETL最精彩的部分“數(shù)據(jù)流轉(zhuǎn)換”,敬請期待。
轉(zhuǎn)載于:https://www.cnblogs.com/invinboy/archive/2009/12/16/1619809.html
總結(jié)
以上是生活随笔為你收集整理的SSIS 学习(2):数据流任务(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工程师必备APP抓包技能
- 下一篇: Python怎么实现微信群万人同步直播