版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.-Kettle培訓(xùn)技術(shù)文檔0507Etl介紹ETL(Extract-Transform-Load的縮寫,即數(shù)據(jù)抽取、轉(zhuǎn)換、裝載的過(guò)程),對(duì)于金融IT來(lái)說(shuō),經(jīng)常會(huì)遇到大數(shù)據(jù)量的處理,轉(zhuǎn)換,遷移,所以了解并掌握一種etl工具的使用,必不可少。謝謝閱讀Kettle是一款國(guó)外開(kāi)源的etl工具,純java編寫,綠色無(wú)需安裝,數(shù)據(jù)抽取高效穩(wěn)定。Kettle中有兩種腳本文件,transformation和job,transformation完成針對(duì)數(shù)據(jù)的基礎(chǔ)轉(zhuǎn)換,job則完成整個(gè)工作流的控制。精品文檔放心下載kettle部署運(yùn)行將kettle2.5.1文件夾拷貝到本地路徑,例如D盤根目錄。感謝閱讀雙擊運(yùn)行kettle文件夾下的spoon.bat文件,出現(xiàn)kettle歡迎界面:精品文檔放心下載.-稍等幾秒選擇沒(méi)有資源庫(kù),打開(kāi)kettle主界面.-創(chuàng)建transformation,job點(diǎn)擊頁(yè)面左上角的創(chuàng)建一個(gè)新的transformation,點(diǎn)擊保存到本地路精品文檔放心下載徑,例如保存到D:/etltest下,保存文件名為EtltestTrans,kettle默認(rèn)transformation文件保存后后綴名為ktr精品文檔放心下載點(diǎn)擊頁(yè)面左上角的創(chuàng)建一個(gè)新的job,點(diǎn)擊保存到本地路徑,例如保精品文檔放心下載存到D:/etltest下,保存文件名為EtltestJob,kettle默認(rèn)job文件保存后后綴名為kjb感謝閱讀創(chuàng)建數(shù)據(jù)庫(kù)連接在transformation頁(yè)面下,點(diǎn)擊左邊的【MainTree】,雙擊【DB連接】,進(jìn)行數(shù)據(jù)庫(kù)連接配置。謝謝閱讀.-connectionname自命名連接名稱Connectiontype選擇需要連接的數(shù)據(jù)庫(kù)Methodofaccess選擇連接類型Serverhostname寫入數(shù)據(jù)庫(kù)服務(wù)器的ip地址感謝閱讀Databasename寫入數(shù)據(jù)庫(kù)名Portnumber寫入端口號(hào)Username寫入用戶名Password寫入密碼例如如下配置:.-點(diǎn)擊【test】,如果出現(xiàn)如下提示則說(shuō)明配置成功.-點(diǎn)擊關(guān)閉,再點(diǎn)擊確定保存數(shù)據(jù)庫(kù)連接。一個(gè)簡(jiǎn)單的ktr例子目的:將一個(gè)數(shù)據(jù)庫(kù)導(dǎo)入到另一個(gè)數(shù)據(jù)庫(kù)中。操作步驟:創(chuàng)建一個(gè)transformation,命名為etlTestTrans.ktr,創(chuàng)建數(shù)據(jù)庫(kù)連接謝謝閱讀ods,點(diǎn)擊【Input】,選中【表輸入】,拖到主窗口,釋放鼠標(biāo),雙擊打感謝閱讀開(kāi)如下圖.-點(diǎn)擊【Transform】,選中【字段選擇】,拖到主窗口,釋放鼠標(biāo)點(diǎn)擊【Output】,選中【表輸出】,拖到主窗口,釋放鼠標(biāo)感謝閱讀建立【文本文件輸入】和【字段選擇】與【字段選擇】和【表輸出】的連接感謝閱讀雙擊【表輸出】,目標(biāo)表中寫入ZT_TEST_KETTLE,,確定保存感謝閱讀.-雙擊【字段選擇】,點(diǎn)擊獲取選擇的字段,再點(diǎn)擊EdltMapping,點(diǎn)擊OK確定,編輯所有字段對(duì)應(yīng)關(guān)系,點(diǎn)確定。感謝閱讀.-點(diǎn)擊 運(yùn)行這個(gè)轉(zhuǎn)換。,則將上一個(gè)ktr中生成的文本,導(dǎo)入到數(shù)據(jù)庫(kù)當(dāng)中。感謝閱讀一個(gè)簡(jiǎn)單的kjb例子目的:將上一個(gè)transformation在一個(gè)job里面調(diào)用執(zhí)行。謝謝閱讀操作步驟:在etlTestJob頁(yè)面,點(diǎn)擊【CoreObjects】,點(diǎn)擊【Jobentries】,選中【START】拖動(dòng)到主窗口釋放鼠標(biāo),再選中【Transformation】,拖動(dòng)到主窗口釋放鼠標(biāo),建立【START】和【Transformation】之間的連接。謝謝閱讀雙擊【Transformation】,在Transformationfilename中寫入E:\kettleWorkspace\etlTestTrans.ktr,確定保存。感謝閱讀.-點(diǎn)擊 保存創(chuàng)建好的job。點(diǎn)擊運(yùn)行這個(gè)轉(zhuǎn)換。待所有任務(wù)都顯示成功,則為job調(diào)用transformation運(yùn)行成功。謝謝閱讀.-一個(gè)增量的例子增量更新按照數(shù)據(jù)種類的不同大概可以分成:只增加,不更新,只更新,不增加即增加也更新有刪除,有增加,有更新下面針對(duì)前三種做一個(gè)增量的ETL抽取。過(guò)程如下:謝謝閱讀根據(jù)前面講解的例子一樣,首先建立源表(fina_test1)和目標(biāo)表(fina_test2),整個(gè)設(shè)計(jì)流程如下:謝謝閱讀其中第一個(gè)步驟(輸入-目標(biāo)表)的sql大概如下模式:謝謝閱讀.-selectifnull(max(date_seal),'1900-01-0100:00:00')fromfina_test2謝謝閱讀你會(huì)注意到第二個(gè)步驟和第一個(gè)步驟的連接是黃色的線,這是因?yàn)榈诙€(gè)tableinput(輸入-源表)步驟把前面一個(gè)步驟的輸出當(dāng)作一個(gè)參數(shù)來(lái)用,所有Kettle用黃色的線來(lái)表示,第二個(gè)tableinput(輸入-源表)的sql模式大概如下:感謝閱讀SELECT *FROMfina_test1 wheredate_seal>?謝謝閱讀后面的一個(gè)問(wèn)號(hào)就是表示它需要接受一個(gè)參數(shù),你在這個(gè)tableinput(輸入-源表)下面需要指定replacevariableinscript選項(xiàng)和執(zhí)行每一行為選中狀態(tài),這樣,Kettle就會(huì)循環(huán)執(zhí)行這個(gè)sql,執(zhí)行的次數(shù)為前面參數(shù)步驟傳入的數(shù)據(jù)集的大小。感謝閱讀關(guān)于第三個(gè)步驟執(zhí)行插入/更新步驟需要特別解釋一下,Kettle執(zhí)行這個(gè)步驟是需要兩個(gè)數(shù)據(jù)流對(duì)比,其中一個(gè)是目標(biāo)數(shù)據(jù)庫(kù),你在目標(biāo)表里面指定的,它放在用來(lái)查詢的關(guān)鍵字左邊的表字段里面的,另外一個(gè)數(shù)據(jù)流就是你在前一個(gè)步驟傳進(jìn)來(lái)的,它放在用來(lái)查詢的關(guān)鍵字的右邊,Kettle首先用你傳進(jìn)來(lái)的key在數(shù)據(jù)庫(kù)中查詢這些記錄,如果沒(méi)有找到,它就插入一條記錄,所有的值謝謝閱讀.-都跟你原來(lái)的值相同,如果根據(jù)這個(gè)key找到了這條記錄,kettle會(huì)比較這兩條記錄,根據(jù)你指定updatefield來(lái)比較,如果數(shù)據(jù)完全一樣,kettle就什么都不做,如果記錄不完全一樣,kettle就執(zhí)行一個(gè)update步驟。謝謝閱讀備注:主鍵被修改得數(shù)據(jù)認(rèn)為是新記錄刪除的數(shù)據(jù)由在倉(cāng)庫(kù)中需要保留無(wú)需考慮然后點(diǎn)擊新建-job,然后
job
的核心對(duì)象
jobentries拉出組建,進(jìn)行執(zhí)行抽取。創(chuàng)建kettle資料庫(kù)資源庫(kù)是用來(lái)保存轉(zhuǎn)換任務(wù)的,用戶通過(guò)圖形界面創(chuàng)建的的轉(zhuǎn)換任務(wù)可以保存在資源庫(kù)中。資源庫(kù)可以是各種常見(jiàn)的數(shù)據(jù)庫(kù),用戶通過(guò)用戶名/密碼來(lái)訪問(wèn)資源庫(kù)中的資源,默認(rèn)的用戶名/密碼是admin/admin謝謝閱讀資源庫(kù)并不是必須的,如果沒(méi)有資源庫(kù),用戶還可以把轉(zhuǎn)換任務(wù)保存在xml文件中。精品文檔放心下載.-如果用戶需要?jiǎng)?chuàng)建一個(gè)資源庫(kù),在資源庫(kù)的登錄窗口(PDI啟動(dòng)時(shí)的第一個(gè)窗口)感謝閱讀中有【新建】按鈕,點(diǎn)擊該按鈕彈出新建資源庫(kù)窗口,精品文檔放心下載在該窗口中選擇一個(gè)數(shù)據(jù)庫(kù)連接,如果沒(méi)有事先定義的數(shù)據(jù)庫(kù)連接,則還要點(diǎn)擊【新建】按鈕,來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接。選擇數(shù)據(jù)庫(kù)連接后,要為該資源庫(kù)命名,作為這個(gè)資源庫(kù)的唯一標(biāo)志,精品文檔放心下載最后選擇【創(chuàng)建或更新】按鈕來(lái)創(chuàng)建這個(gè)資源庫(kù)。.-資源庫(kù)可以使多用戶共享轉(zhuǎn)換任務(wù),轉(zhuǎn)換任務(wù)在資源庫(kù)中是以文件夾形式分組管理的,用戶可以自定義文件夾名稱。謝謝閱讀如何使用kettle讀取包含多行表的Excel文件謝謝閱讀如果Excel工作表的表頭只有一行,使用Kettle讀取這樣的文件是很容易的.謝謝閱讀如果Excel工作表的表頭是多行的,或者是分級(jí)的就需要在內(nèi)容標(biāo)簽下正確設(shè)置列名所占行數(shù)才可以讀取.精品文檔放心下載考慮這樣的一個(gè)工作表如果想把里面的12列數(shù)據(jù)都讀出來(lái),就要考慮如何處理多級(jí)表頭.謝謝閱讀步驟設(shè)置的詳細(xì)描述:.-步驟一選擇文件名,現(xiàn)在文件或目錄里 到所要添加的excel文檔,然后點(diǎn)擊,精品文檔放心下載確定后,點(diǎn)擊 ,步驟二選擇要讀取的工作表名稱和要讀取的內(nèi)容在工作表里的起始位置,也就是表頭開(kāi)始的行號(hào)和列號(hào)(這里行號(hào)和列號(hào)是以0開(kāi)始的)精品文檔放心下載步驟三設(shè)置要讀取的內(nèi)容的一些屬性,這里要設(shè)置表頭的所占行數(shù)是4行.感謝閱讀.-步驟四錯(cuò)誤處理,選擇如果有錯(cuò)誤終止還是繼續(xù),錯(cuò)誤信息保存的文件等.謝謝閱讀(圖略)步驟五選擇字段,如果前面的三個(gè)步驟(不包括錯(cuò)誤處理步驟)都設(shè)置正確,在這個(gè)頁(yè)面選擇"獲取字段"字段按鈕,就會(huì)獲得所有的列名稱和數(shù)據(jù)類型.精品文檔放心下載這里我們可以看到:多級(jí)表頭中各級(jí)表頭的名稱被疊加起來(lái),形成了唯一的列名.精品文檔放心下載點(diǎn)擊[預(yù)覽]按鈕可以預(yù)覽到數(shù)據(jù).-對(duì)于表頭跨連續(xù)的多行, 但不分級(jí)的情況也可以使用上述方式處理.感謝閱讀kettle注釋:1、 kettle的控制流可以設(shè)置一些簡(jiǎn)單的時(shí)間,并且可以實(shí)現(xiàn)隔斷天、周、月(三個(gè)只精品文檔放心下載能選一個(gè),不能選那個(gè)月的那周那日),但是kettle工具不能關(guān),如果關(guān)了,必須精品文檔放心下載重新啟動(dòng)。2、 kettle里面缺少一個(gè)編輯的字段的插件,導(dǎo)致字段編輯很麻煩,這只能先sql中進(jìn)謝謝閱讀行手寫,這個(gè)對(duì)寫sql的要求很高。一個(gè)kettle字段轉(zhuǎn)換(截?。┑睦哟笾碌牧鞒淌牵罕磔斎脒€是正常的sql查詢,沒(méi)有添加參數(shù)。字段轉(zhuǎn)換(截?。┦窃?進(jìn)行修改。具體樣式如下:具體的用法:transformFunctions里面包括了字符、數(shù)字的一些函數(shù)方法,這些函數(shù)方法可以解決一些字段需要轉(zhuǎn)化的問(wèn)題。精品文檔放心下載Inputfields和Outputfields里面包括了從表輸入 進(jìn)謝謝閱讀來(lái)的字段(數(shù)據(jù))。字段主要轉(zhuǎn)化的操作界面:注意下:substr(xxx,1,2)中的1代表是第一位開(kāi)始,2代表是取2位,在這里面還可以添加if等語(yǔ)句,進(jìn)行編寫。謝謝閱讀在字段選擇那里面要配置從js過(guò)來(lái)的字段,點(diǎn)擊列映射(前提是已經(jīng)和表輸出連接上),這個(gè)字段對(duì)應(yīng)要根據(jù)你實(shí)際從js倒過(guò)來(lái)的字段和目標(biāo)表相對(duì)應(yīng)的字段一一對(duì)應(yīng)。精品文檔放心下載.-開(kāi)源ETL工具kettle系列之常見(jiàn)問(wèn)題摘要:本文主要介紹使用kettle設(shè)計(jì)一些ETL任務(wù)時(shí)一些常見(jiàn)問(wèn)題,這些問(wèn)題大部分都不在官方FAQ上,你可以在kettle的論壇上找到一些問(wèn)題的答案精品文檔放心下載Join我得到A數(shù)據(jù)流(不管是基于文件或數(shù)據(jù)庫(kù)),A包含field1,field2,field3精品文檔放心下載字段,然后我還有一個(gè)B數(shù)據(jù)流,B包含field4,field5,field6,我現(xiàn)在想把它們‘加’起來(lái),應(yīng)該怎么樣做.謝謝閱讀這是新手最容易犯錯(cuò)的一個(gè)地方,A數(shù)據(jù)流跟B數(shù)據(jù)流能夠Join,肯定是它們包含joinkey,joinkey可以是一個(gè)字段也可以是多個(gè)字段。如果兩個(gè)數(shù)據(jù)流沒(méi)有joinkey,那么它們就是在做笛卡爾積,一般很少會(huì)這樣。比如你現(xiàn)在需要列出一個(gè)員工的姓名和他所在部門的姓名,如果這是在同一個(gè)數(shù)據(jù)庫(kù),大家都知道會(huì)在一個(gè)sq感謝閱讀里面加上where限定條件,但是如果員工表和部門表在兩個(gè)不同的數(shù)據(jù)流里面,尤其是數(shù)據(jù)源的來(lái)源是多個(gè)數(shù)據(jù)庫(kù)的情況,我們一般是要使用DatabaseJoin操作,然后用兩個(gè)databasetableinput來(lái)表示輸入流,一個(gè)輸入是部門表的姓名,另一個(gè)是員工表的姓名,然后我們認(rèn)為這兩個(gè)表就可以”Join”了,我們需要的輸出的確是這兩個(gè)字段,但是這兩個(gè)字段的輸出并不代表只需要這兩個(gè)字段的輸入,謝謝閱讀.-它們之間肯定是需要一個(gè)約束關(guān)系存在的。另外,無(wú)論是在做Join,Merge,Update,Delete這些常規(guī)操作的時(shí)候,都是先需要做一個(gè)compare操作的,這個(gè)compare操作都是針對(duì)comparekey的,無(wú)論兩個(gè)表結(jié)構(gòu)是不是一樣的,比如employee表和department表,它們比較的依據(jù)就是employee的外鍵department_id,沒(méi)有這個(gè)comparekey這兩個(gè)表是不可能連接的起來(lái)的..對(duì)于兩個(gè)表可能還有人知道是直接sql來(lái)做連接,如果是多個(gè)輸入數(shù)據(jù)源,然后是三個(gè)表,有人就開(kāi)始迷茫了,A表一個(gè)字段,B表一個(gè)字段,C表一個(gè)字段,然后就連Join操作都沒(méi)有,直接databasetableoutput,然后開(kāi)始報(bào)錯(cuò),報(bào)完錯(cuò)就到處找高手問(wèn),他們的數(shù)據(jù)庫(kù)原理老師已經(jīng)在吐血了。如果是三個(gè)表連接,一個(gè)sql不能搞定,就需要先兩個(gè)表兩個(gè)表的連接,通過(guò)兩次comparekey連接之后得到你的輸出,記住,你的輸出并不能代表你的輸入.下面總結(jié)一下:感謝閱讀單數(shù)據(jù)源輸入,直接用sql做連接多數(shù)據(jù)源輸入,(可能是文本或是兩個(gè)以上源數(shù)據(jù)庫(kù)),用databasejoin操謝謝閱讀作.三個(gè)表以上的多字段輸出.2.Kettle的數(shù)據(jù)庫(kù)連接模式Kettle的數(shù)據(jù)庫(kù)連接是一個(gè)步驟里面控制一個(gè)單數(shù)據(jù)庫(kù)連接,所以kettle的連接有數(shù)據(jù)庫(kù)連接池,你可以在指定的數(shù)據(jù)庫(kù)連接里面指定一開(kāi)始連接池里面放多少個(gè)數(shù)據(jù)庫(kù)連接,在創(chuàng)建數(shù)據(jù)庫(kù)連接的時(shí)候就有Pooling選項(xiàng)卡,里面可以指定最大連接數(shù)和初始連接數(shù),這可以一定程度上提高速度.感謝閱讀transaction我想在步驟A執(zhí)行一個(gè)操作(更新或者插入),然后在經(jīng)過(guò)若干個(gè)步驟之后,如果我發(fā)現(xiàn)某一個(gè)條件成立,我就提交所有的操作,如果失敗,我就回滾,kettle提供這種事務(wù)性的操作嗎?精品文檔放心下載Kettle里面是沒(méi)有所謂事務(wù)的概念的,每個(gè)步驟都是自己管理自己的連接的,在這個(gè)步驟開(kāi)始的時(shí)候打開(kāi)數(shù)據(jù)庫(kù)連接,在結(jié)束的時(shí)候關(guān)閉數(shù)據(jù)庫(kù)連接,一個(gè)步驟是肯定不會(huì)跨session的(數(shù)據(jù)庫(kù)里面的session),另外,由于kettle是并行執(zhí)行的,所以不可能把一個(gè)數(shù)據(jù)庫(kù)連接打開(kāi)很長(zhǎng)時(shí)間不放,這樣可能會(huì)造成鎖出現(xiàn),雖然不一定是死鎖,但是對(duì)性能還是影響太大了。ETL中的事務(wù)對(duì)性能影響也很大,所以不應(yīng)該設(shè)計(jì)一種依賴與事務(wù)方式的ETL執(zhí)行順序,畢竟這不是OLTP,因?yàn)槟憧赡芤淮涡枰峤坏臄?shù)據(jù)量是幾百GB都有可能,任何一種數(shù)據(jù)庫(kù)維持一個(gè)幾百GB的回滾段性能都是會(huì)不大幅下降的.精品文檔放心下載我真的需要transaction但又不想要一個(gè)很復(fù)雜的設(shè)計(jì),能不能提供一個(gè)簡(jiǎn)單一點(diǎn)的方式感謝閱讀Kettle在3.0.2GA版中將推出一種新功能,在一個(gè)tableoutput步驟中有一個(gè)Miscellaneous選項(xiàng)卡,其中有一個(gè)Useuniqueconnections的選項(xiàng),如果你選中的話就可以得到一個(gè)transaction的簡(jiǎn)單版,謝謝閱讀由于是使用的單數(shù)據(jù)庫(kù)連接,所以可以有錯(cuò)誤的時(shí)候回滾事務(wù),不過(guò)要提醒一點(diǎn)是感謝閱讀.-這種方式是以犧牲非常大的性能為前提條件的,對(duì)于太大的數(shù)據(jù)量是不適合的(個(gè)人仍然不建議使用這種方式)謝謝閱讀temporary表如何使用我要在ETL過(guò)程中創(chuàng)建一個(gè)中間表,當(dāng)某個(gè)條件成立的時(shí)候,我要把中間表的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,當(dāng)另一條件成立的時(shí)候我要對(duì)中間表進(jìn)行另一個(gè)操作,我想使用數(shù)據(jù)庫(kù)的臨時(shí)表來(lái)操作,應(yīng)該用什么步驟。感謝閱讀首先從temp表的生命周期來(lái)分,temp分為事務(wù)臨時(shí)表和會(huì)話臨時(shí)表,前面已經(jīng)解釋過(guò)了,kettle是沒(méi)有所謂事務(wù)的概念的,所以自然也沒(méi)有所謂的事務(wù)臨時(shí)表。Kettle的每個(gè)步驟管理自己的數(shù)據(jù)庫(kù)連接,連接一結(jié)束,kettle也就自然丟掉了這個(gè)連接的session的handler,沒(méi)有辦法可以在其他步驟拿回這個(gè)session的handler,所以也就不能使用所謂的會(huì)話臨時(shí)表,當(dāng)你嘗試再開(kāi)一個(gè)連接的時(shí)候,你可以連上這個(gè)臨時(shí)表,但是你想要的臨時(shí)表里面的數(shù)據(jù)都已經(jīng)是空的(數(shù)據(jù)不一定被清除了,但是你連不上了),所以不要設(shè)計(jì)一個(gè)需要使用臨時(shí)表的轉(zhuǎn)換感謝閱讀之所以會(huì)使用臨時(shí)表,其實(shí)跟需要”事務(wù)”特性有一點(diǎn)類似,都是希望在ETL過(guò)程中提供一種緩沖。臨時(shí)表很多時(shí)候都不是某一個(gè)源表的全部數(shù)據(jù)的鏡像,很多時(shí)候臨時(shí)表都是很小一部分結(jié)果集,可能經(jīng)過(guò)了某種計(jì)算過(guò)程,你需要臨時(shí)表無(wú)非是基于下面三個(gè)特性:精品文檔放心下載表結(jié)構(gòu)固定,用一個(gè)固定的表來(lái)接受一部分?jǐn)?shù)據(jù)。每次連接的時(shí)候里面沒(méi)有數(shù)據(jù)。你希望它接受數(shù)據(jù),但是不保存,每次都好像執(zhí)行了truncatetable操作一樣精品文檔放心下載不同的時(shí)候連接臨時(shí)表用同一個(gè)名字,你不想使用多個(gè)連接的時(shí)候用類似與temp1,temp2,temp3,temp4這種名字,應(yīng)為它們表結(jié)構(gòu)一樣。謝謝閱讀既然臨時(shí)表不能用,應(yīng)該如何設(shè)計(jì)ETL過(guò)程呢?(可以用某種詭異的操作搞出臨時(shí)表,不過(guò)不建議這樣做罷了)精品文檔放心下載如果你的ETL過(guò)程比較的單線程性,也就是你清楚的知道同一時(shí)間只有一個(gè)這樣的表需要,你可以創(chuàng)建一個(gè)普通的表,每次連接的時(shí)候都執(zhí)行truncate操作,不論是通過(guò)tableoutput的truncatetable選項(xiàng),還是通過(guò)手工執(zhí)行truncatetablesql語(yǔ)句(在executesqlscript步驟)都可以達(dá)到目的(基于上面的1,2感謝閱讀特性)如果你的ETL操作比較的多線程性,同一時(shí)間可能需要多個(gè)表結(jié)構(gòu)一樣并且里面都是為空的表(基于上面1,2,3特性),你可以創(chuàng)建一個(gè)“字符串+序列”的模式,每次需要的時(shí)候,就創(chuàng)建這樣的表,用完之后就刪除,因?yàn)槟阕约翰灰欢ㄖ滥阈枰嗌賯€(gè)這種類型的表,所以刪除會(huì)比truncate好一些。精品文檔放心下載下面舉個(gè)例子怎么創(chuàng)建這種表:你可以使用某種約定的表名比如department_temp作為department的臨時(shí)表?;蛑x謝閱讀者把a(bǔ)rgument傳到表名,使用department_${argument}的語(yǔ)法,感謝閱讀如果你需要多個(gè)這種表,使用一個(gè)sequence操作+executesqlscript操作,executesqlscript就下面這種模式精品文檔放心下載.-Createtable_? (…………..)在表的名字上加參數(shù),前面接受一個(gè)sequence或類似的輸入操作.感謝閱讀需要注意的是這種參數(shù)表名包括databasetableinput或者executesqlscript謝謝閱讀,只要是參數(shù)作為表名的情況前面的輸入不能是從數(shù)據(jù)庫(kù)來(lái)的,應(yīng)為沒(méi)有辦法執(zhí)行這種preparedStatement語(yǔ)句,從數(shù)據(jù)庫(kù)來(lái)的值后面的操作是“值操作”,而不是字符串替換,只有argument或者sequence操作當(dāng)作參數(shù)才是字符串替換.(這一點(diǎn)官方FAQ也有提到)精品文檔放心下載updatetable和executesqlscript里面執(zhí)行update的區(qū)別精品文檔放心下載執(zhí)行updatetable操作是比較慢的,它會(huì)一條一條基于comparekey對(duì)比數(shù)據(jù),然后決定是不是要執(zhí)行updatesql,如果你知道你要怎么更新數(shù)據(jù)盡可能的使用executesqlscript操作,在里面手寫updatesql(注意源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)在哪),這種多行執(zhí)行方式(updatesql)肯定比單行執(zhí)行方式(updatetable操作)快的多。感謝閱讀另一個(gè)區(qū)別是executesqlscript操作是可以接受參數(shù)的輸入的。它前面可以是一個(gè)跟它完全不關(guān)的表一個(gè)sql:謝謝閱讀selectfield1,field2field3fromtableA感謝閱讀后面執(zhí)行另一個(gè)表的更新操作:updatetableBsetfield4=?wherefield5=?Andfield6=?感謝閱讀然后選中executesqlscript的executeforeachrow.注意參數(shù)是一一對(duì)應(yīng)的.(field4對(duì)應(yīng)field1的值,field5對(duì)應(yīng)field2的值,field6對(duì)應(yīng)field3的值)精品文檔放心下載kettle的性能kettle本身的性能絕對(duì)是能夠應(yīng)對(duì)大型應(yīng)用的,一般的基于平均行長(zhǎng)150的一條記精品文檔放心下載錄,假設(shè)源數(shù)據(jù)庫(kù),目標(biāo)數(shù)據(jù)庫(kù)以及kettle都分別在幾臺(tái)機(jī)器上(最常見(jiàn)的桌面工感謝閱讀作模式,雙核,1G內(nèi)存),速度大概都可以到5000行每秒左右,如果把硬件提高感謝閱讀一些,性能還可以提升,但是ETL過(guò)程中難免遇到性能問(wèn)題,下面一些通用的步感謝閱讀驟也許能給你一些幫助.盡量使用數(shù)據(jù)庫(kù)連接池盡量提高批處理的commitsize盡量使用緩存,緩存盡量大一些(主要是文本文件和數(shù)據(jù)流)Kettle是Java做的,盡量用大一點(diǎn)的內(nèi)存參數(shù)啟動(dòng)Kettle.可以使用sql來(lái)做的一些操作盡量用sql精品文檔放心下載Group,merge,streamlookup,splitfield這些操作都是比較慢的,想辦法避免他們.,能用sql就用sql謝謝閱讀插入大量數(shù)據(jù)的時(shí)候盡量把索引刪掉盡量避免使用update,delete操作,尤其是update,如果可以把update變成先delete,后insert.謝謝閱讀能使用truncatetable的時(shí)候,就不要使用deleteallrow這種類似sql合理的分區(qū)精品文檔放心下載.-如果刪除操作是基于某一個(gè)分區(qū)的,就不要使用deleterow這種方式(不管是deletesql還是delete步驟),直接把分區(qū)drop掉,再重新創(chuàng)建盡量縮小輸入的數(shù)據(jù)集的大小(增量更新也是為了這個(gè)目的)感謝閱讀盡量使用數(shù)據(jù)庫(kù)原生的方式裝載文本文件(Oracle的sqlloader,mysql的bulkloader步驟)感謝閱讀盡量不要用kettle的calculate計(jì)算步驟,能用數(shù)據(jù)庫(kù)本身的sql就用sql,不能用sql就盡量想辦法用procedure,實(shí)在不行才是calculate步驟.精品文檔放心下載要知道你的性能瓶頸在哪,可能有時(shí)候你使用了不恰當(dāng)?shù)姆绞?,?dǎo)致整個(gè)操作都變慢,觀察kettlelog生成的方式來(lái)了解你的ETL操作最慢的地方。感謝閱讀遠(yuǎn)程數(shù)據(jù)庫(kù)用文件+FTP的方式來(lái)傳數(shù)據(jù),文件要壓縮。(只要不是局域網(wǎng)都可以認(rèn)為是遠(yuǎn)程連接)精品文檔放心下載描述物理環(huán)境源數(shù)據(jù)庫(kù)的操作系統(tǒng),硬件環(huán)境,是單數(shù)據(jù)源還是多數(shù)據(jù)源,數(shù)據(jù)庫(kù)怎么分布的,精品文檔放心下載ETL的那臺(tái)機(jī)器放在哪,操作系統(tǒng)和硬件環(huán)境是什么,目標(biāo)數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)庫(kù)是什么,操作系統(tǒng),硬件環(huán)境,數(shù)據(jù)庫(kù)的字符集怎么選,數(shù)據(jù)傳輸方式是什么,開(kāi)發(fā)環(huán)境,測(cè)試環(huán)境和實(shí)際的生產(chǎn)環(huán)境有什么區(qū)別,是不是需要一個(gè)中間數(shù)據(jù)庫(kù)(staging數(shù)據(jù)庫(kù)),源數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)版本號(hào)是多少,測(cè)試數(shù)據(jù)庫(kù)的版本號(hào)是多少,真正的目標(biāo)數(shù)據(jù)庫(kù)的版本號(hào)是多少…….這些信息也許很零散,但是都需要一份專門的文檔來(lái)描述這些信息,無(wú)論是你遇到問(wèn)題需要?jiǎng)e人幫助的時(shí)候描述問(wèn)題本身,還是發(fā)現(xiàn)測(cè)試環(huán)境跟目標(biāo)數(shù)據(jù)庫(kù)的版本號(hào)不一致,這份專門的文檔都能提供一些基本的信息謝謝閱讀procedure為什么我不能觸發(fā)procedure?這個(gè)問(wèn)題在官方FAQ里面也有提到,觸發(fā)procedure和httpclient都需要一個(gè)類似與觸發(fā)器的條件,你可以使用generaterow步驟產(chǎn)生一個(gè)空的row,然后把這條記錄連上procedure步驟,這樣就會(huì)使這條沒(méi)有記錄的空行觸發(fā)這個(gè)procedure(如果你打算使用無(wú)條件的單次觸發(fā)),當(dāng)然procedure也可以象tableinput里面的步驟那樣傳參數(shù)并且多次執(zhí)行.謝謝閱讀另外一個(gè)建議是不要使用復(fù)雜的procedure來(lái)完成本該ETL任務(wù)完成的任務(wù),比如創(chuàng)建表,填充數(shù)據(jù),創(chuàng)建物化視圖等等.謝謝閱讀字符集Kettle使用Java通常使用的UTF8來(lái)傳輸字符集,所以無(wú)論你使用何種數(shù)據(jù)庫(kù),任何數(shù)據(jù)庫(kù)種類的字符集,kettle都是支持的,如果你遇到了字符集問(wèn)題,也許下面這些提示可以幫助你:感謝閱讀單數(shù)據(jù)庫(kù)到單數(shù)據(jù)庫(kù)是絕對(duì)不會(huì)出現(xiàn)亂碼問(wèn)題的,不管原數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)是何種種類,何種字符集謝謝閱讀多種不同字符集的原數(shù)據(jù)庫(kù)到一個(gè)目標(biāo)數(shù)據(jù)庫(kù),你首先需要確定多種源數(shù)據(jù)庫(kù)的字符集的最大兼容字符集是什么,如果你不清楚,最好的辦法就是使用UTF8來(lái)創(chuàng)建數(shù)據(jù)庫(kù).精品文檔放心下載.-不要以你工作的環(huán)境來(lái)判斷字符集:現(xiàn)在某一個(gè)測(cè)試人員手上有一個(gè)oracle的基于xxx字符集的已經(jīng)存在的數(shù)據(jù)庫(kù),并且非常不幸的是xxx字符集不是utf8類型的,于是他把另一個(gè)基于yyy字符集的oracle數(shù)據(jù)庫(kù)要經(jīng)過(guò)某一個(gè)ETL過(guò)程轉(zhuǎn)換到oracle,后來(lái)他發(fā)現(xiàn)無(wú)論怎么樣設(shè)置都會(huì)出現(xiàn)亂碼,這是因?yàn)槟愕臄?shù)據(jù)庫(kù)本身的字符集不支持,無(wú)論你怎么設(shè)置都是沒(méi)用的.測(cè)試的數(shù)據(jù)庫(kù)不代表最后產(chǎn)品運(yùn)行的數(shù)據(jù)庫(kù),尤其是有時(shí)候?yàn)榱耸∈掳讯鄠€(gè)不同的項(xiàng)目的不相關(guān)的數(shù)據(jù)庫(kù)裝在同一臺(tái)機(jī)器上,測(cè)試的時(shí)候又沒(méi)有分析清楚這種環(huán)境,所以也再次強(qiáng)調(diào)描述物理環(huán)境的重要性.精品文檔放心下載你所看到的不一定代表實(shí)際儲(chǔ)存的:mysql處理字符集的時(shí)候是要在jdbc連接的參數(shù)里面加上字符集參數(shù)的,而oracle則是需要服務(wù)器端和客戶端使用同一種字符集才能正確顯示,所以你要明確你所看到的字符集亂碼不一定代表真的就是字符集亂碼,這需要你檢查在轉(zhuǎn)換之前的字符集是否會(huì)出現(xiàn)亂碼和轉(zhuǎn)換之后是否出現(xiàn)亂碼,你的桌面環(huán)境可能需要變動(dòng)一些參數(shù)來(lái)適應(yīng)這種變動(dòng)精品文檔放心下載不要在一個(gè)轉(zhuǎn)換中使用多個(gè)字符集做為數(shù)據(jù)源.預(yù)定義時(shí)間維Kettle提供了一個(gè)小工具幫助我們預(yù)填充時(shí)間維,這個(gè)工具在kettle_home/samples/transformations/General–populatedatedimension.這個(gè)示例產(chǎn)生的數(shù)據(jù)不一定能滿足各種需要,不過(guò)你可以通過(guò)修改這個(gè)示例來(lái)滿足自己的需求.精品文檔放心下載SQLtab和Optionstab在你創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接的時(shí)候除了可以指定你一次需要初始化的連接池參數(shù)之外(在Pooling選項(xiàng)卡下面),還包括一個(gè)Options選項(xiàng)卡和一個(gè)SQL選項(xiàng)卡,Options選項(xiàng)卡里面主要設(shè)置一些連接時(shí)的參數(shù),比如autocommit是on還是off,defaultFetchSize,useCursorFetch(mysql默認(rèn)支持的),oracle還支持比如defaultExecuteBatch,oracle.jdbc.StreamBufferSize,oracle.jdbc.FreeMemoryOnEnterImplicitCache,你可以查閱對(duì)應(yīng)數(shù)據(jù)庫(kù)所支持的連接參數(shù),另外一個(gè)小提示:在創(chuàng)建數(shù)據(jù)庫(kù)連接的時(shí)候,選擇你的數(shù)據(jù)庫(kù)類型,然后選到Options選項(xiàng)卡,下面有一個(gè)Showhelptextonoptionsusage,點(diǎn)擊這個(gè)按鈕會(huì)把你帶到對(duì)應(yīng)各個(gè)數(shù)據(jù)庫(kù)的連接參數(shù)的官方的一個(gè)參數(shù)列表頁(yè)面,通過(guò)查詢這個(gè)列表頁(yè)面你就可以知道那種數(shù)據(jù)庫(kù)可以使用何種參數(shù)了.精品文檔放心下載對(duì)于SQL選項(xiàng)卡就是在你一連接這個(gè)Connection之后,Kettle會(huì)立刻執(zhí)行的sql感謝閱讀語(yǔ)句,個(gè)人比較推薦的一個(gè)sql是執(zhí)行把所有日期格式統(tǒng)一成同一格式的sql,比如在oracle里面就是:謝謝閱讀altersessionsetnls_date_format=xxxxxxxxxxxxxaltersessionsetnls_xxxxxxxxx=xxxxxxxxxxxx謝謝閱讀這樣可以避免你在轉(zhuǎn)換的時(shí)候大量使用to_date(),to_char函數(shù)而僅僅只是為了統(tǒng)一日期格式,對(duì)于增量更新的時(shí)候尤其適用.謝謝閱讀數(shù)據(jù)復(fù)制有的時(shí)候可能我們需要的是類似數(shù)據(jù)復(fù)制或者一個(gè)備份數(shù)據(jù)庫(kù),這個(gè)時(shí)候你需要的是一種數(shù)據(jù)庫(kù)私有的解決方案,Kettle也許并不是你的第一選擇,比如對(duì)于Oracl精品文檔放心下載.-e來(lái)說(shuō),可能rman,oraclestream,oraclereplication等等,mysql也有mysqlrmaster/slave模式的replication等私有的解決方法,如果你確定你的需求不是數(shù)據(jù)集成這方面的,那么也許kettle并不是一個(gè)很好的首選方案,你應(yīng)該咨詢一下專業(yè)的DBA人士也會(huì)會(huì)更好.謝謝閱讀如何控制版本變更Kettle的每一個(gè)transformation和job都有一個(gè)version字段(在你保存的時(shí)候),不過(guò)這個(gè)功能還不實(shí)用,如果你需要版本控制的話,還是建議你將transformation和job轉(zhuǎn)換成文本文件保存,然后用svn或cvs或任意你熟悉的版本控制系統(tǒng)將其保存,kettle將在下一個(gè)版本加入版本控制的功能(做的更易用).精品文檔放心下載支持的數(shù)據(jù)源Kettle支持相當(dāng)廣的數(shù)據(jù)源,比如在數(shù)據(jù)庫(kù)里面的一些不太常見(jiàn)的Access,MaxDB(SAPDB),Hypersonic,SAPR/3system,BorlandInterbase,OracleRDB,Teradata和3.0新加入的SybaseIQ.感謝閱讀另外還包括Excel,CSV,LDAP,以及OLAPServerMondrian,目前支持WebService不過(guò)暫時(shí)還不支持SOAP.感謝閱讀調(diào)試和測(cè)試ETL轉(zhuǎn)換出現(xiàn)不可預(yù)知的問(wèn)題時(shí),或是你不清楚某個(gè)步驟的功能是什么的情況下,你可能需要?jiǎng)?chuàng)建一個(gè)模擬環(huán)境來(lái)調(diào)適程序,下面一些建議可能會(huì)有所幫助:感謝閱讀盡量使用generaterow步驟或者固定的一個(gè)文本文件來(lái)創(chuàng)建一個(gè)模擬的數(shù)據(jù)源模擬的數(shù)據(jù)源一定要有代表性,數(shù)據(jù)集一定盡量小(為了性能考慮)但是數(shù)據(jù)本身要足夠分散.精品文檔放心下載創(chuàng)建了模擬的數(shù)據(jù)集后你應(yīng)該清楚的知道你所要轉(zhuǎn)換之后的數(shù)據(jù)時(shí)什么樣的.精品文檔放心下載錯(cuò)誤處理在ETL任務(wù)中由于數(shù)據(jù)問(wèn)題出現(xiàn)轉(zhuǎn)換錯(cuò)誤是一件非常正常的事情,你不應(yīng)該設(shè)計(jì)一個(gè)依賴于臨時(shí)表或者擁有事務(wù)特點(diǎn)的ETL過(guò)程,面對(duì)數(shù)據(jù)源質(zhì)量問(wèn)題的巨大挑戰(zhàn),錯(cuò)誤處理是并不可少的,kettle同樣提供非常方便的錯(cuò)誤處理方式,在你可能會(huì)出錯(cuò)的步驟點(diǎn)擊右鍵選擇DefineErrorhanding,它會(huì)要求你指定一個(gè)處理error的步驟,你可以使用文本文件或者數(shù)據(jù)庫(kù)的表來(lái)儲(chǔ)存這些錯(cuò)誤信息,這些錯(cuò)誤信息會(huì)包含一個(gè)id和一個(gè)出錯(cuò)的字段,當(dāng)你得到這些錯(cuò)誤信息之后就需要你自己分析出錯(cuò)的原因了,比如違反主鍵約束可能是你生成主鍵的方式有錯(cuò)誤或者本身的數(shù)據(jù)有重復(fù),而違反外鍵約束則可能是你依賴的一些表里面的數(shù)據(jù)還沒(méi)有轉(zhuǎn)換或者外鍵表本身過(guò)濾掉了這些數(shù)據(jù).當(dāng)你調(diào)整了這些錯(cuò)誤之后,確定所有依賴的數(shù)據(jù)都被正確的處理了.kettleuserguide里面有更詳細(xì)的解釋,里面還附帶了一個(gè)使用javascript來(lái)處理錯(cuò)誤的示例,這種方式可以作為處理簡(jiǎn)單數(shù)據(jù)質(zhì)量的方式.感謝閱讀文檔,文檔,文檔Kettle提供了豐富的文檔和使用手冊(cè),小到一個(gè)數(shù)據(jù)庫(kù)連接怎么連,大到一個(gè)功能怎么實(shí)現(xiàn),所有的參數(shù)列表,對(duì)話框的每一個(gè)輸入輸出代表什么意思都有解釋,所以當(dāng)你遇到問(wèn)題你應(yīng)該第一時(shí)間翻閱這些文檔,也許上面已經(jīng)告訴你怎么做了.另感謝閱讀.-kettle還有一個(gè)非?;钴S的社區(qū),你可以到上面提問(wèn),但是記住在你提問(wèn)之前先搜索一下論壇看有沒(méi)有類似的問(wèn)題已經(jīng)問(wèn)過(guò)了,如果沒(méi)有記得描述清楚你的問(wèn)題精品文檔放心下載總結(jié)本系列文章主要討論了如何使用kettle來(lái)處理數(shù)據(jù)倉(cāng)庫(kù)中的緩慢增長(zhǎng)維,動(dòng)態(tài)ETL如何設(shè)計(jì),增量更新的一些設(shè)計(jì)技巧,在應(yīng)用程序中如何集成kettle以及在使用kettle時(shí)的一些常見(jiàn)問(wèn)題.如果你正在尋找一個(gè)工具來(lái)幫助你解決數(shù)據(jù)庫(kù)的集成問(wèn)題或是你打算建立一個(gè)商業(yè)智能項(xiàng)目的數(shù)據(jù)倉(cāng)庫(kù),那么kettle是一個(gè)不錯(cuò)的選擇,你不用支付任何費(fèi)用就可以得到很多很多數(shù)據(jù)集成的特性,大量文檔和社區(qū)支持.難道這些不就是你希望從一個(gè)商業(yè)工具上的到的嗎?還在等什么,開(kāi)始你的數(shù)據(jù)集成之旅吧精品文檔放心下載開(kāi)源ETL工具kettle系列之在應(yīng)用程序中集成感謝閱讀摘要:本文主要討論如何在你自己的Java應(yīng)用程序中集成Kettle精品文檔放心下載如果你需要在自己的Java應(yīng)用程序中集成Kettle,一般來(lái)說(shuō)有兩種應(yīng)用需求,一種是通過(guò)純?cè)O(shè)計(jì)器來(lái)設(shè)計(jì)ETL轉(zhuǎn)換任務(wù),然后保存成某種格式,比如xml或者在數(shù)據(jù)庫(kù)中都可以,然后自己調(diào)用程序解析這個(gè)格式,執(zhí)行這種轉(zhuǎn)換,是比較抽象的一種執(zhí)行方式,ETL里面轉(zhuǎn)換了什么東西我們并不關(guān)心,只關(guān)心它有沒(méi)有正常執(zhí)行。另一種是通過(guò)完全編程的方式來(lái)實(shí)現(xiàn),詳細(xì)的控制每一個(gè)步驟,需要知道轉(zhuǎn)換執(zhí)行的成功與否,這種方式可能需要更多的理解kettle的API以便更好的跟你的應(yīng)用程序緊密結(jié)合,不過(guò)難度也比較大,可以很好的定制你的應(yīng)用程序,代價(jià)自然是入門門檻比較高。本文主要向你解釋第一種Kettle的集成方式,文中所列出的代碼節(jié)選自pentaho,不過(guò)應(yīng)用程序本身跟pentaho沒(méi)有什么關(guān)系。精品文檔放心下載Pentaho集成kettle的代碼主要是兩個(gè)類,KettleSystemListener和KettleComponent,看名字就猜出KettleSystemListener主要是起監(jiān)聽(tīng)器的作用,它主要負(fù)責(zé)初始化kettle的一些環(huán)境變量,這個(gè)類主要包含四個(gè)方法:startup(),readProperties(),environmentInit(),shutdown(),程序入口自然是startup()方法,然后它會(huì)調(diào)用environmentInit()方法,這個(gè)方法就調(diào)用readProperties()方法讀一個(gè)配置文件perties,這個(gè)文件主要記錄者kettle運(yùn)行時(shí)可以調(diào)用的一些環(huán)境變量,關(guān)于perties文件怎么用,第二篇文章“使用Kettle設(shè)計(jì)動(dòng)態(tài)轉(zhuǎn)換”有提到,readProperties()方法讀完這個(gè)文件之后就把里面的鍵值對(duì)轉(zhuǎn)換成變量傳給kettle運(yùn)行環(huán)境.當(dāng)kettle運(yùn)行完了之后就調(diào)用shutdown()方法結(jié)束轉(zhuǎn)換.KettleSystemListener相對(duì)邏輯比較簡(jiǎn)單,就不多介紹,下面主要介紹重點(diǎn)類:感謝閱讀KettleComponentKettleComponent的方法主要有三種類型,一類是用來(lái)初始化工作,做一些驗(yàn)證工作,第二類是執(zhí)行轉(zhuǎn)換的方法,也是主要需要討論的方法,第三類是取得數(shù)據(jù)結(jié)果的,有時(shí)候你需要得到轉(zhuǎn)換的結(jié)果交給下一個(gè)步驟處理.下面分別討論這三類方法。精品文檔放心下載初始化KettleComponent的初始化工作主要是驗(yàn)證這個(gè)轉(zhuǎn)換,包括有validateSystemSettings(),init(),validateAction(),全部都是public方法,valida精品文檔放心下載.-teSystemSettings()會(huì)檢查kettle使用何種方式來(lái)連接資源庫(kù)。謝謝閱讀kettle有兩種方式連接資源庫(kù),一種是純數(shù)據(jù)庫(kù)式,也就是你所有的轉(zhuǎn)換全部都保存在一個(gè)數(shù)據(jù)庫(kù)中,一般你在開(kāi)始使用kettle的時(shí)候,它都會(huì)要求你建立一個(gè)資源倉(cāng)庫(kù),這個(gè)資源倉(cāng)庫(kù)的連接方式就是你的數(shù)據(jù)庫(kù)連接,你需要能夠有相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)和對(duì)應(yīng)的連接用戶名和密碼。另外一種連接方式是使用文本文件,也就是xml文件,在做完任何轉(zhuǎn)換之后,我們都可以把轉(zhuǎn)換或者Job變成xml文件輸出,這個(gè)輸出文件包含你所有轉(zhuǎn)換的全部信息。謝謝閱讀在示例應(yīng)用中使用的是文件的連接方式,下面看一下初始化的一段代碼:感謝閱讀BooleanuseRepository=PentahoSystem.getSystemSetting("kettle/settings.xml",精品文檔放心下載"repository.type","files").equals("rdbms");感謝閱讀PentahoSystem.getSystemSetting()方法只是返回一個(gè)字符串,使用的xpath讀謝謝閱讀一個(gè)xml的對(duì)應(yīng)字段,下面列出settings.xml文件:謝謝閱讀<kettle-repository><!--Thevalueswithin<properties>arepasseddirectlytotheKettlePentahocomponents.-->感謝閱讀<!--ThisisthelocationoftheKettlerepositories.xmlfile,leaveemptyifthedefaultisused:$HOME/.kettle/repositories.xml-->精品文檔放心下載<repositories.xml.file></repositories.xml.file><repository.type>files</repository.type>精品文檔放心下載<!--Thenameoftherepositorytouse--><></><repository.userid>admin</repository.userid><repository.password>admin</repository.password>精品文檔放心下載</kettle-repository>可以看到其中的repositories.xml.file上面的一段注釋,如果這個(gè)值為空會(huì)默認(rèn)使用$HOME/.kettle/repository.xml文件當(dāng)作資源庫(kù)的連接文件,由于示例中使用的是文本文件所以沒(méi)有用數(shù)據(jù)庫(kù)連接,下面的repository.userid和repository.password是指的kettle的資源庫(kù)連接的用戶名和密碼,一般默認(rèn)安裝就兩個(gè),admin/admin和guest/guest,這里的用戶名和密碼不是連接數(shù)據(jù)庫(kù)的用戶名和密碼,連接數(shù)據(jù)庫(kù)的用戶名和密碼是在另外一個(gè)文件repositories.xml.file指定的值所定義的感謝閱讀一般默認(rèn)的kettle安裝并且運(yùn)行了一段時(shí)間之后,會(huì)在$HOME/.kettle目錄下創(chuàng)建一些文件,如果你要在自己的系統(tǒng)中集成kettle的話,也需要保留這些文件,當(dāng)然不一定位置是在原來(lái)的位置,關(guān)鍵是要讓kettle知道這些文件放在哪。謝謝閱讀執(zhí)行轉(zhuǎn)換當(dāng)讀完了這些配置文件并且驗(yàn)證了之后,KettleComponent就開(kāi)始把前面讀到的轉(zhuǎn)換文件或者資源庫(kù)類型變成Kettle的API,這主要是在executeAction()方法里面謝謝閱讀.-進(jìn)行,它當(dāng)然根據(jù)連接方式也分兩種執(zhí)行類型:文本執(zhí)行方式資源庫(kù)連接方式文本執(zhí)行方式需要接受一個(gè)你指定的運(yùn)行轉(zhuǎn)換的文件或者Job的文件,然后把謝謝閱讀這個(gè)xml文件解析成Kettle能夠執(zhí)行的模式,精品文檔放心下載根據(jù)執(zhí)行的類型又可以分成兩種:Trans任務(wù)Job任務(wù)兩個(gè)執(zhí)行的邏輯差不多,下面先介紹Trans的執(zhí)行方式:感謝閱讀執(zhí)行Trans任務(wù)transMeta=newTransMeta(fileAddress,repository,true);謝謝閱讀transMeta.setFilename(fileAddress);謝謝閱讀然后它會(huì)調(diào)用:executeTransformation(TransMetatransMeta,LogWriterlogWriter)精品文檔放心下載這個(gè)方法是真正的把前面的來(lái)的transMeta轉(zhuǎn)換成trans對(duì)象,等待下一步的執(zhí)行:謝謝閱讀Transtrans=newTrans(logWriter,transMeta);謝謝閱讀ListstepList=trans.getSteps();精品文檔放心下載for(intstepNo=0;stepNo<stepList.size();stepNo++){StepMetaDataCombistep=(StepMetaDataCombi)stepList.get(ste謝謝閱讀pNo);if(step.stepname.equals(stepName))精品文檔放心下載{①
Rowrow=transMeta.getStepFields(stepName);謝謝閱讀//createthemetadatathatthePentahoresul感謝閱讀tsetneedsStringfieldNames[]=row.getFieldNames();Stringcolumns[][]=newString[1][fieldNames.謝謝閱讀length];for(intcolumn=0;column<fieldNames.leng謝謝閱讀th;column++){columns[0][column]=fieldNames[c精品文檔放心下載olumn];②umns,null);
}MemoryMetaDatametaData=newMemoryMetaData(col謝謝閱讀③
results=newMemoryResultSet(metaData);精品文檔放心下載//addourselfasarowlistener感謝閱讀step.step.addRowListener(this);精品文檔放心下載foundStep=true;.-break;}}Row對(duì)象是kettle用來(lái)表示一行數(shù)據(jù)的標(biāo)準(zhǔn)對(duì)象,跟jdbc取出來(lái)的一條數(shù)據(jù)轉(zhuǎn)化后成為的一個(gè)POJO是一樣的。里面可以包含多個(gè)字段。精品文檔放心下載.MemoryMetaData對(duì)象是pentaho特有的,是專門用來(lái)返回ETL任務(wù)執(zhí)行后的結(jié)精品文檔放心下載果的,與標(biāo)準(zhǔn)的JDBC里面的resultSet對(duì)應(yīng)的resultSetMetaData 是一樣的。謝謝閱讀對(duì)于如何處理數(shù)據(jù)的一個(gè)Listener,實(shí)現(xiàn)的是一個(gè)RowListener,數(shù)據(jù)是每一行每一行處理的,后面會(huì)介紹如果需要輸出數(shù)據(jù)怎么取得這些輸出數(shù)據(jù)。如果不需要放回任何對(duì)象,則從1處開(kāi)始都可以不要,只要初始化step對(duì)象即可。感謝閱讀所有的step對(duì)象都已經(jīng)初始化之后就可以開(kāi)始執(zhí)行了,trans.startThreads();trans.waitUntilFinished();精品文檔放心下載結(jié)束之后還有一些清理工作就不列出了。執(zhí)行Job任務(wù)執(zhí)行Job任務(wù)之前還是會(huì)讀取Job任務(wù)的描述文件,然后把這個(gè)描述文件(kettle的.ktr文件)變成一個(gè)xml文檔的dom:精品文檔放心下載org.w3c.dom.Documentdoc=XmlW3CHelper.getDomFromString(jobXmlStr);之后也是初始化對(duì)應(yīng)的元數(shù)據(jù)對(duì)象JobMeta感謝閱讀jobMeta=newJobMeta(logWriter,doc.getFirstChild(),repository);得到了jobMeta之后就可以執(zhí)行這個(gè)Job了,這里跟trans是一樣的。謝謝閱讀job=newJob(logWriter,StepLoader.getInstance(),repository,jobMeta);由于Job一般都沒(méi)有什么返回值,所以Job不需要初始化它下面的對(duì)象,直接開(kāi)始運(yùn)行就可以了精品文檔放心下載job.start();job.waitUntilFinished(5000000);謝謝閱讀連接資源庫(kù)連接資源庫(kù)使用的是connectToRepository()方法,先取得RepositoriesMeta對(duì)象,然后根據(jù)你在setting.xml文件里面定義的repository的名字來(lái)連接對(duì)應(yīng)的repository.理論上來(lái)說(shuō)我們一般都只使用一個(gè)repository,但如果在產(chǎn)品中需要使用多個(gè)repository的話,你需要自己配置多個(gè)repository的名字和對(duì)應(yīng)的用戶名和密碼。只列出幾行關(guān)鍵代碼,謝謝閱讀repositoriesMeta=newRepositoriesMeta(logWriter);repositoriesMeta.readData();//從$HOME/.kettle/repositories.xml讀數(shù)據(jù).repositoryMeta=repositoriesMeta.findRepository(repositoryName);repository=newRepository(logWriter,repositoryMeta,userInfo);userInfo=newUserInfo(repository,username,password);精品文檔放心下載從資源庫(kù)讀取Trans連接到資源庫(kù)之后自然是想辦法讀取數(shù)據(jù)庫(kù)的表,把里面的記錄轉(zhuǎn)換成為Trans對(duì)謝謝閱讀.-象,使用的是loadTransformFromRepository,這個(gè)方法的函數(shù)原型需要解釋一下:TransMetaloadTransformFromRepository(StringdirectoryName,StringtransformationName,Repositoryrepository,LogWriterlogWriter)謝謝閱讀第一個(gè)參數(shù)StringdirectoryName代表是你儲(chǔ)存轉(zhuǎn)換的目錄,當(dāng)你使用kettle圖形界面的時(shí)候,點(diǎn)擊repository菜單的explorerrepository,你會(huì)發(fā)現(xiàn)你所有的東西都是存儲(chǔ)在一個(gè)虛擬的類似與目錄結(jié)構(gòu)的地方,其中包括databaseconnections,transformations,job,users等,所以你需要的是指定你連接的目錄位置,你也可以在目錄里面再創(chuàng)建目錄。精品文檔放心下載StringtransformationName自然指的就是你轉(zhuǎn)換的名字.謝謝閱讀Repositoryrepository指的是你連接的資源庫(kù)。感謝閱讀LogWriterlogWriter指定你的日志輸出,這個(gè)log指的是你kettle轉(zhuǎn)換的日志輸出,不是應(yīng)用程序本身的輸出。精品文檔放心下載讀取TransMeta的步驟也相對(duì)比較簡(jiǎn)單repositoryDirectory=repository.getDirectoryTree().findDirectory(director感謝閱讀yName);transMeta=newTransMeta(repository,transformationName,repositoryDirectory);精品文檔放心下載從資源庫(kù)讀取Job從資源庫(kù)讀取Job跟Trans的步驟基本是一樣的,同樣需要指定你存儲(chǔ)Job的目錄位置.精品文檔放心下載JobMetaloadJobFromRepository(StringdirectoryName,StringjobName,Repositoryrepository,LogWriterlogWriter)感謝閱讀讀取結(jié)果集一般Job都是不會(huì)返回任何結(jié)果集的,大部分Trans也不會(huì)返回結(jié)果集,應(yīng)為結(jié)果集一般都會(huì)直接從一個(gè)數(shù)據(jù)庫(kù)到另一個(gè)數(shù)據(jù)庫(kù)了,但是如果你需要返回轉(zhuǎn)換的結(jié)果集,那么這一小結(jié)將會(huì)向你解釋如何從一個(gè)Trans里面讀取這些結(jié)果集謝謝閱讀首先,你需要一個(gè)容納Result的容器,就是類似與JDBC里面的resultSet,resultSet當(dāng)然會(huì)有一個(gè)resultSetMetadata跟它相關(guān)聯(lián),在本文所舉的實(shí)例中,使用的是pentaho私有的memoryResultSet,感謝閱讀你可以不用關(guān)心它的細(xì)節(jié),并且它的類型正如它的名字一樣是存在與Memory的,所以它不能被持久化,這個(gè)里面儲(chǔ)存的是一個(gè)二維的Object數(shù)組,里面的數(shù)據(jù)就是從kettle轉(zhuǎn)化之后來(lái)的。謝謝閱讀要從kettle的轉(zhuǎn)換中讀取結(jié)果集,要實(shí)現(xiàn)RowListener接口,Row是kettle里面謝謝閱讀表示一行數(shù)據(jù)的一個(gè)類,RowListener自然是指在轉(zhuǎn)換數(shù)據(jù)轉(zhuǎn)換的時(shí)候發(fā)生的事件,感謝閱讀它有三個(gè)方法需要實(shí)現(xiàn),voidrowReadEvent(Row)voidrowWrittenEvent(Row)voiderrorRowWrittenEvent(Row)精品文檔放心下載分別對(duì)應(yīng)讀數(shù)據(jù)時(shí)的事件,寫數(shù)據(jù)事的時(shí)間,出錯(cuò)時(shí)的時(shí)間,我們需要取得結(jié)果集,感謝閱讀.-所以只需要實(shí)現(xiàn)rowWrittenEvent(Row)就可以了,Row對(duì)象是通過(guò)TransMeta取得的,謝謝閱讀Rowrow=transMeta.getStepFields(stepName);下面給出具體實(shí)現(xiàn)取Row轉(zhuǎn)換成resultSet的代碼:精品文檔放心下載ObjectpentahoRow[]=newObject[results.getColumnCount()];謝謝閱讀for(intcolumnNo=0;columnNo<results.getColumnCount();columnNo++){精品文檔放心下載Valuevalue=row.getValue(columnNo);精品文檔放心下載switch(value.getType()){謝謝閱讀caseValue.VALUE_TYPE_BIGNUMBER:pentahoRow[columnNo]=value.getBigNumber();break;精品文檔放心下載........results.addRow(pentahoRow);精品文檔放心下載默認(rèn)的數(shù)據(jù)類型是String類型(在省略部分).感謝閱讀整個(gè)代碼最重要的一行是Valuevalue=row.getValue(columnNo);謝謝閱讀這是真正取得實(shí)際數(shù)據(jù)的一行。有時(shí)候你會(huì)覺(jué)得實(shí)現(xiàn)一個(gè)resultSet比較麻煩,尤其是你還要實(shí)現(xiàn)相關(guān)的resultSetMetaData,怎么把數(shù)據(jù)轉(zhuǎn)換成你自己的類型,你大可以就用一個(gè)ListofList來(lái)實(shí)現(xiàn),里面的List就代表Row的對(duì)應(yīng)數(shù)據(jù),外面一層List就是result,整個(gè)代碼會(huì)簡(jiǎn)單一些,當(dāng)然,你要自己知道最后這個(gè)List怎么用.精品文檔放心下載本文有意隱藏了一些跟pentaho有關(guān)的細(xì)節(jié),比如validateSystemSettings(),init(),validateAction()方法,這些都是pentaho私有的,有些方法比如rowWrittenEvent(Row)是用來(lái)取結(jié)果集的,但是很多時(shí)候我們不需要取轉(zhuǎn)換的結(jié)果集,文中很多代碼都只列出主要的部分,省略一些判斷,調(diào)試,log部分的代碼,大家可以自己下載這些代碼來(lái)研究,謝謝閱讀本文并沒(méi)有給出一個(gè)可以獨(dú)立運(yùn)行的示例,因?yàn)檫@個(gè)示例一定會(huì)太過(guò)于簡(jiǎn)單(不超過(guò)15行代碼),但是卻并不能考慮到各種情況,連接資源庫(kù)還是文件,運(yùn)行轉(zhuǎn)換還是Job,metadata怎么得來(lái)的,需不需要轉(zhuǎn)換之后的結(jié)果。精品文檔放心下載關(guān)于在本文一開(kāi)始提到的使用kettle的兩種方式,對(duì)于第二種使用方式:使用完全精品文檔放心下載編程的方式來(lái)運(yùn)行轉(zhuǎn)換,其實(shí)它的與第一種方式的區(qū)別就好像一個(gè)用設(shè)計(jì)器來(lái)寫xm謝謝閱讀l文件,一個(gè)用純手工方式寫xml文件(用代碼的xml),大家可以參考官方網(wǎng)站上精品文檔放心下載的一段示例代碼,地址如下:/downloads/api.php精品文檔放心下載開(kāi)源ETL工具kettle系列之增量更新設(shè)計(jì)感謝閱讀ETL中增量更新是一個(gè)比較依賴與工具和設(shè)計(jì)方法的過(guò)程,Kettle中主要提供Insert/Update步驟,Delete步驟和DatabaseLookup步驟來(lái)支持增量更新,增量更新的設(shè)計(jì)方法也是根據(jù)應(yīng)用場(chǎng)景來(lái)選取的,雖然本文討論的是Kettle的實(shí)現(xiàn)精品文檔放心下載.-方式,但也許對(duì)其他工具也有一些幫助。本文不可能涵蓋所有的情況,歡迎大家討論。感謝閱讀應(yīng)用場(chǎng)景增量更新按照數(shù)據(jù)種類的不同大概可以分成:只增加,不更新,只更新,不增加即增加也更新有刪除,有增加,有更新其中1,2,3種大概都是相同的思路,使用的步驟可能略有不同,通用的方法是在原數(shù)據(jù)庫(kù)增加一個(gè)時(shí)間戳,然后在轉(zhuǎn)換之后的對(duì)應(yīng)表保留這個(gè)時(shí)間戳,然后每次抽取數(shù)據(jù)的時(shí)候,先讀取這個(gè)目標(biāo)數(shù)據(jù)庫(kù)表的時(shí)間戳的最大值,把這個(gè)值當(dāng)作參數(shù)傳給原數(shù)據(jù)庫(kù)的相應(yīng)表,根據(jù)這個(gè)時(shí)間戳來(lái)做限定條件來(lái)抽取數(shù)據(jù),抽取之后同樣要保留這個(gè)時(shí)間戳,并且原數(shù)據(jù)庫(kù)的時(shí)間戳一定是指定默認(rèn)值為sysdate當(dāng)前時(shí)間(以原數(shù)據(jù)庫(kù)的時(shí)間為標(biāo)準(zhǔn)),抽取之后的目標(biāo)數(shù)據(jù)庫(kù)的時(shí)間戳要保留原來(lái)的時(shí)間戳,而不是抽取時(shí)候的時(shí)間。謝謝閱讀對(duì)于第一種情況,可以使用Kettle的Insert/Update步驟,只是可以勾選Don’tperformanyupdate選項(xiàng),這個(gè)選項(xiàng)可以告訴Kettle你只會(huì)執(zhí)行Insert步驟。謝謝閱讀對(duì)于第二種情況可能比較用在數(shù)據(jù)出現(xiàn)錯(cuò)誤然后原數(shù)據(jù)庫(kù)有一些更新,相應(yīng)的目標(biāo)數(shù)據(jù)庫(kù)也要更新,這時(shí)可能不是更新所有的數(shù)據(jù),而是有一些限定條件的數(shù)據(jù),你可以使用Kettle的Update步驟來(lái)只執(zhí)行更新。關(guān)于如何動(dòng)態(tài)的執(zhí)行限定條件,可以參考前一篇文章。感謝閱讀第三種情況是最為常見(jiàn)的一種情況,使用的同樣是Kettle的Insert/Update步驟,只是不要勾選Don’tperformanyupdate選項(xiàng)。第四種情況有些復(fù)雜,后面專門討論。精品文檔放心下載對(duì)于第1,2,3種情況,可以參考下面的例子。這個(gè)例子假設(shè)原數(shù)據(jù)庫(kù)表為customers,含有一個(gè)id,firstname,lastname,謝謝閱讀age字段,主鍵為id,然后還加上一個(gè)默認(rèn)值為sysdate的時(shí)間戳字段。轉(zhuǎn)換之后的結(jié)果類似:id,firstname,lastname,age,updatedate.整個(gè)設(shè)計(jì)流程大概如下:感謝閱讀1.-其中第一個(gè)步驟的sql大概如下模式:Selectmax(updatedate)fromtarget_customer;謝謝閱讀你會(huì)注意到第二個(gè)步驟和第一個(gè)步驟的連接是黃色的線,這是因?yàn)榈诙€(gè)tableinput步驟把前面一個(gè)步驟的輸出當(dāng)作一個(gè)參數(shù)來(lái)用,所有Kettle用黃色的線來(lái)表示,第二個(gè)tableinput的sql模式大概如下:精品文檔放心下載Selectfield1,field2,field3fromcustomerswhereupdatedate>?精品文檔放心下載后面的一個(gè)問(wèn)號(hào)就是表示它需要接受一個(gè)參數(shù),你在這個(gè)tableinput下面需要指定replacevariableinscript選項(xiàng)和executeforeachrow為選中狀態(tài),這樣,Kettle就會(huì)循環(huán)執(zhí)行這個(gè)sql,執(zhí)行的次數(shù)為前面參數(shù)步驟傳入的數(shù)據(jù)集的大小。感謝閱讀圖2.-關(guān)于第三個(gè)步驟執(zhí)行insert/update步驟需要特別解釋一下,謝謝閱讀圖3Kettle執(zhí)行這個(gè)步驟是需要兩個(gè)數(shù)據(jù)流對(duì)比,其中一個(gè)是目標(biāo)數(shù)據(jù)庫(kù),你在Targettable里面指定的,它放在Thekeystolookupthevalues(s)左邊的Tablefield里面的,另外一個(gè)數(shù)據(jù)流就是你在前一個(gè)步驟傳進(jìn)來(lái)的,它放在Thekeystolookupthevalue(s)的右邊,Kettle首先用你傳進(jìn)來(lái)的key在數(shù)據(jù)庫(kù)中查詢這些記錄,如果沒(méi)有找到,它就插入一條記錄,所有的值都跟你原來(lái)的值相同,如果根據(jù)這個(gè)key找到了這條記錄,kettle會(huì)比較這兩條記錄,根據(jù)你指定updat感謝閱讀field來(lái)比較,如果數(shù)據(jù)完全一樣,kettle就什么都不做,如果記錄不完全一樣,kettle就執(zhí)行一個(gè)update步驟。所以首先你要確保你指定的key字段能夠唯一確定一條記錄,這個(gè)時(shí)候會(huì)有兩種情況:精品文檔放心下載.-1.維表2.事實(shí)表維表大都是通過(guò)一個(gè)主鍵字段來(lái)判斷兩條記錄是否匹配,可能我們的原數(shù)據(jù)庫(kù)的主鍵記錄不一定對(duì)應(yīng)目標(biāo)數(shù)據(jù)庫(kù)中相應(yīng)的表的主鍵,這個(gè)時(shí)候原數(shù)據(jù)庫(kù)的主鍵就變成了業(yè)務(wù)主鍵,你需要根據(jù)某種條件判斷這個(gè)業(yè)務(wù)主鍵是否相等,想象一下如果是多個(gè)數(shù)據(jù)源的話,業(yè)務(wù)主鍵可能會(huì)有重復(fù),這個(gè)時(shí)候你需要比較的是根據(jù)你自定義生成的新的實(shí)際的主鍵,這種主鍵可能是根據(jù)某種類似與sequence的生成方式生成的,感謝閱讀事實(shí)表在經(jīng)過(guò)轉(zhuǎn)換之后,進(jìn)目標(biāo)數(shù)據(jù)庫(kù)之前往往都是通過(guò)多個(gè)外鍵約束來(lái)確定唯一一條記錄的,這個(gè)時(shí)候比較兩條記錄是否相等都是通過(guò)所有的維表的外鍵決定的,你在比較了記錄相等或不等之后,還要自己判斷是否需要添加一個(gè)新的主鍵給這個(gè)新記錄。精品文檔放心下載上面兩種情況都是針對(duì)特定的應(yīng)用的,如果你的轉(zhuǎn)換過(guò)程比較簡(jiǎn)單,只是一個(gè)原數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)目標(biāo)數(shù)據(jù)庫(kù),業(yè)務(wù)主鍵跟代理主鍵完全相同的時(shí)候完全可以不用考慮這么多。謝謝閱讀有刪除,有增加,有更新首先你需要判斷你是否在處理一個(gè)維表,如果是一個(gè)維表的話,那么這可能是一個(gè)SCD情況,可以使用Kettle的DimensionLookup步驟來(lái)解決這個(gè)問(wèn)題,如果你要處理的是事實(shí)表,方法就可能有所不同,它們之間的主要區(qū)別是主鍵的判斷方式不一樣。感謝閱讀事實(shí)表一般都數(shù)據(jù)量很大,需要先確定是否有變動(dòng)的數(shù)據(jù)處在某一個(gè)明確的限定條件之下,比如時(shí)間上處在某個(gè)特定區(qū)間,或者某些字段有某種限定條件,盡量最大程度的先限定要處理的結(jié)果集,然后需要注意的是要先根據(jù)id來(lái)判斷記錄的狀態(tài),是不存在要插入新紀(jì)錄,還是已存在要更新,還是記錄不存在要?jiǎng)h除,分別對(duì)于id的狀態(tài)來(lái)進(jìn)行不同的操作。謝謝閱讀處理刪除的情況使用Delete步驟,它的原理跟Insert/Update步驟一樣,只不過(guò)在找到了匹配的id之后執(zhí)行的是刪除操作而不是更新操作,然后處理Insert/Update操作,你可能需要重新創(chuàng)建一個(gè)轉(zhuǎn)換過(guò)程,然后在一個(gè)Job里面定義這兩個(gè)轉(zhuǎn)換之間的執(zhí)行順序。精品文檔放心下載如果你的數(shù)據(jù)變動(dòng)量比較大的話,比如超過(guò)了一定的百分比,如果執(zhí)行效率比較低下,可以適當(dāng)考慮重新建表。感謝閱讀另外需要考慮的是維表的數(shù)據(jù)刪除了,對(duì)應(yīng)的事實(shí)表或其他依賴于此維表的表的數(shù)據(jù)如何處理,外鍵約束可能不太容易去掉,或者說(shuō)一旦去掉了就可能再加上去了,這可能需要先處理好事實(shí)表的依賴數(shù)據(jù),主要是看你如何應(yīng)用,如果只是簡(jiǎn)單的刪除事實(shí)表數(shù)據(jù)的話還比較簡(jiǎn)單,但是如果需要保留事實(shí)表相應(yīng)記錄,可以在維表中增加一條記錄,這條記錄只有一個(gè)主鍵,其他字段為空,當(dāng)我們刪除了維表數(shù)據(jù)后,事實(shí)表的數(shù)據(jù)就更新指向這條空的維表記錄。精品文檔放心下載定時(shí)執(zhí)行增量更新.-可能有時(shí)候我們就是定時(shí)執(zhí)行更新操作,比如每天或者一個(gè)星期一次,這個(gè)時(shí)候可謝謝閱讀以不需要在目標(biāo)表中增加一個(gè)時(shí)間戳字段來(lái)判斷ETL進(jìn)行的最大時(shí)間,直接在取得感謝閱讀原數(shù)據(jù)庫(kù)的時(shí)間加上限定條件比如:Startdate>?andenddate<?感謝閱讀或者只有一個(gè)startdateStartdate>? (昨天的時(shí)間或者上個(gè)星期的時(shí)間)精品文檔放心下載這個(gè)時(shí)候需要傳一個(gè)參數(shù),用getSystemInfo步驟來(lái)取得,而且你還可以控制時(shí)間的精度,比如到天而不是到秒的時(shí)間。精品文檔放心下載當(dāng)然,你也需要考慮一下如果更新失敗了怎么處理,比如某一天因?yàn)槟撤N原因沒(méi)有更新,這樣可能這一天的記錄需要手工處理回來(lái),如果失敗的情況經(jīng)??赡馨l(fā)生,那還是使用在目標(biāo)數(shù)據(jù)庫(kù)中增加一個(gè)時(shí)間字段取最大時(shí)間戳的方式比較通用,雖然它多了一個(gè)很少用的字段。謝謝閱讀執(zhí)行效率和復(fù)雜度刪除和更新都是一項(xiàng)比較耗費(fèi)時(shí)間的操作,它們都需要不斷的在數(shù)據(jù)庫(kù)中查詢記錄,執(zhí)行刪除操作或更新操作,而且都是一條一條的執(zhí)行,執(zhí)行效率低下也是可以預(yù)見(jiàn)的,盡量可能的縮小原數(shù)據(jù)集大小。減少傳輸?shù)臄?shù)據(jù)集大小,降低ETL的復(fù)雜程度精品文檔放心下載時(shí)間戳方法的一些優(yōu)點(diǎn)和缺點(diǎn)優(yōu)點(diǎn): 實(shí)現(xiàn)方式簡(jiǎn)單,很容易就跨數(shù)據(jù)庫(kù)實(shí)現(xiàn)了,運(yùn)行起來(lái)也容易設(shè)計(jì)感謝閱讀缺點(diǎn):浪費(fèi)大量的儲(chǔ)存空間,時(shí)間戳字段除ETL過(guò)程之外都不被使用,如果是定時(shí)運(yùn)行的,某一次運(yùn)行失敗了,就有可能造成數(shù)據(jù)有部分丟失.謝謝閱讀其他的增量更新辦法:增量更新的核心問(wèn)題在與如何找出自上次更新以后的數(shù)據(jù),其實(shí)大多數(shù)數(shù)據(jù)庫(kù)都能夠有辦法捕捉這種數(shù)據(jù)的變化,比較常見(jiàn)的方式是數(shù)據(jù)庫(kù)的增量備份和數(shù)據(jù)復(fù)制,利用數(shù)據(jù)庫(kù)的管理方式來(lái)處理增量更新就是需要有比較好的數(shù)據(jù)庫(kù)管理能力,大多數(shù)成熟的數(shù)據(jù)庫(kù)都提供了增量備份和數(shù)據(jù)復(fù)制的方法,雖然實(shí)現(xiàn)上各不一樣,不過(guò)由于ETL的增量更新對(duì)數(shù)據(jù)庫(kù)的要求是只要數(shù)據(jù),其他的數(shù)據(jù)庫(kù)對(duì)象不關(guān)心,也不需要完全的備份和完全的standby數(shù)據(jù)庫(kù),所以實(shí)現(xiàn)方式還是比較簡(jiǎn)單的.,只要你創(chuàng)建一個(gè)與原表結(jié)構(gòu)類似的表結(jié)構(gòu),然后創(chuàng)建一個(gè)三種類型的觸發(fā)器,分別對(duì)應(yīng)insert,update,delete操作,然后維護(hù)這個(gè)新表,在你進(jìn)行ETL的過(guò)程的時(shí)候,將增量備份或者數(shù)據(jù)復(fù)制停止,然后開(kāi)始讀這個(gè)新表,在讀完之后將這個(gè)表里面的數(shù)據(jù)刪除掉就可以了,不過(guò)這種方式不太容易定時(shí)執(zhí)行,需要一定的數(shù)據(jù)庫(kù)特定的知識(shí)。如果你對(duì)數(shù)據(jù)的實(shí)時(shí)性要求比較高可以實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)復(fù)制方案,如果對(duì)實(shí)時(shí)性的要求比較低,用增量備份會(huì)比較簡(jiǎn)單一點(diǎn)。謝謝閱讀幾點(diǎn)需要注意的地方:1.觸發(fā)器.-無(wú)論是增量備份還是數(shù)據(jù)復(fù)制,如果原表中有觸發(fā)器,在備份的數(shù)據(jù)庫(kù)上都不要保留觸發(fā)器,因?yàn)槲覀冃枰牟皇且粋€(gè)備份庫(kù),只是需要里面的數(shù)據(jù),最好所有不需要的數(shù)據(jù)庫(kù)對(duì)象和一些比較小的表都不用處理。精品文檔放心下載2.邏輯一致和物理一致數(shù)據(jù)庫(kù)在數(shù)據(jù)庫(kù)備份和同步上有所謂邏輯一致和物理一致的區(qū)別,簡(jiǎn)單來(lái)說(shuō)就是同一個(gè)查詢?cè)趥浞輸?shù)據(jù)庫(kù)上和主數(shù)據(jù)庫(kù)上得到的總的數(shù)據(jù)是一樣的,但是里面每一條的數(shù)據(jù)排列方式可能不一樣,只要沒(méi)有明顯的排序查詢都可能有這種情況(包括groupby,distinct,union等),而這可能會(huì)影響到生成主鍵的方式,需要注意在設(shè)計(jì)主鍵生成方式的時(shí)候最好考慮這一點(diǎn),比如顯式的增加order排序.避免在數(shù)據(jù)出錯(cuò)的時(shí)候,如果需要重新讀一遍數(shù)據(jù)的時(shí)候主鍵有問(wèn)題.謝謝閱讀總結(jié)增量更新是ETL中一個(gè)常見(jiàn)任務(wù),對(duì)于不同的應(yīng)用環(huán)境可能采用不同的策略,本文不可能覆蓋所有的應(yīng)用場(chǎng)景,像是多個(gè)數(shù)據(jù)源匯到一個(gè)目標(biāo)數(shù)據(jù)庫(kù),id生成策略,業(yè)務(wù)主鍵和代理主鍵不統(tǒng)一等等,只是希望能給出一些思路處理比較常見(jiàn)的情況,希望能對(duì)大家有所幫助。謝謝閱讀開(kāi)源ETL工具kettle系列之動(dòng)態(tài)轉(zhuǎn)換摘要:本文主要討論使用Kettle來(lái)設(shè)計(jì)一些較為復(fù)雜和動(dòng)態(tài)的轉(zhuǎn)換可能使用到的一些技巧,這些技巧可能會(huì)讓你在使用Kettle的時(shí)候更加容易的設(shè)計(jì)更強(qiáng)大的ETL任務(wù)。精品文檔放心下載動(dòng)態(tài)參數(shù)的傳遞Kettle在處理運(yùn)行時(shí)輸入?yún)?shù)可以使用JavaScript來(lái)實(shí)現(xiàn),大部分工作只是按照一個(gè)模板來(lái)處理的謝謝閱讀動(dòng)態(tài)參數(shù)傳遞主要使用在像數(shù)據(jù)清理,調(diào)式,測(cè)試,完成復(fù)雜的條件過(guò)濾等等,這種方式一般不會(huì)在產(chǎn)品已經(jīng)運(yùn)行穩(wěn)定了一段時(shí)間之后使用,因?yàn)槲覀円话闳匀皇亲龆〞r(shí)任務(wù)來(lái)自動(dòng)轉(zhuǎn)換數(shù)據(jù),所以在開(kāi)始介紹如何使用動(dòng)態(tài)參數(shù)之前,希望大家能明白不要在產(chǎn)品數(shù)據(jù)庫(kù)上做實(shí)驗(yàn),即使你已經(jīng)知道你的轉(zhuǎn)換有什么影響并且做了備份,因?yàn)檫@種方法是不可能自動(dòng)執(zhí)行的。精品文檔放心下載Kettle有兩種動(dòng)態(tài)參數(shù)傳遞的方法,一
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 滬科版八年級(jí)數(shù)學(xué)上冊(cè)第12章一次函數(shù)12-1函數(shù)第2課時(shí)函數(shù)的表示方法列表法解析法課件
- 北師大版八年級(jí)生物上冊(cè)第6單元生命的延續(xù)第19章生物的生殖和發(fā)育第3節(jié)植物的生殖方式課件
- 六年級(jí)上冊(cè)第三單元總結(jié)語(yǔ)文
- 統(tǒng)編版五年級(jí)語(yǔ)文上冊(cè)第四單元知識(shí)要點(diǎn)
- DB34T 4961-2024農(nóng)村飲用水安全衛(wèi)生評(píng)價(jià)
- 人教版八年級(jí)數(shù)學(xué)上冊(cè)《12.2三角形全等的判定》同步測(cè)試題帶答案
- 【六年級(jí)】上冊(cè)道德與法治-6上2單元第4課《公民的基本權(quán)利和義務(wù)》
- 化 學(xué)物質(zhì)組成的表示課件-2024-2025學(xué)年九年級(jí)化學(xué)人教版(2024)上冊(cè)
- 期中測(cè)試卷(1-4單元)(試題)-2024-2025學(xué)年六年級(jí)上冊(cè)數(shù)學(xué)北師大版
- 青島版科學(xué)三年級(jí)上冊(cè)全冊(cè)教案
- 海南經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘考試行政管理教師崗筆試面試歷年真題庫(kù)試卷
- 神經(jīng)內(nèi)科課件
- 鋰電池環(huán)境試驗(yàn)應(yīng)急預(yù)案
- 大學(xué)食堂原料物資豬肉采購(gòu)?fù)稑?biāo)方案(技術(shù)標(biāo))
- 巴以沖突完整
- 幼兒園大班語(yǔ)言《搖籃(詩(shī)歌)》微課件
- 【公開(kāi)課】被動(dòng)運(yùn)輸課件高一上學(xué)期生物人教版必修1
- 藝術(shù):讓人成為人
- 小學(xué)道德與法治-《平安出行》教學(xué)課件設(shè)計(jì)
- 客戶投訴案例及處理技巧課件
- 初中體育 田徑作業(yè)的有效設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論