天天看點

Kettle 資料遷移

Kettle 中文名稱叫水壺,該項目的主程式員希望把各種資料放到一個壺裡,然後以一種指定的格式流出。

Kettle是用來做資料遷移的,也就是将一個資料庫中的資料全部導入另一個資料庫,說起來簡單,可是要是這兩個資料庫的表中的字段完全不同那怎麼辦呢,總不能簡單的複制粘貼吧,是以就需要将表的字段名稱甚至字段内容都進行一次轉換,才可以解決問題。在這裡關于Kettle的安裝就不做說明了,主要是說說我的用法,也算是一個新手使用教程吧。

打開軟體後,首先,我們先建立一個轉換,ctrl+s進行儲存,輸入一個檔案名,同時,第一次儲存該檔案時,檔案名也會直接成為該轉換的名稱,然後選擇一個自己能找到的位址就行了。

這時我們看左邊,有兩個頁簽可以切換,分别是主對象樹和核心對象,主對象樹就是目前的轉換。核心對象相當于一個工具欄,裡面有各種各樣的工具。我主要用到的有:輸入-表輸入,轉換-值映射,轉換-字段選擇,轉換-增加常量,腳本-java代碼,輸出-表輸出。

我們把所有上述的一個個小子產品都給拖到主面闆上,如圖:

Kettle 資料遷移

然後從第一個開始,首先單擊第一個子產品表輸入,如圖:

Kettle 資料遷移

選擇第四個帶箭頭的圖示,然後會發現有個灰色的箭頭随着你的滑鼠移動,這時将滑鼠移動到第二個子產品值映射上,會發現箭頭變藍這時單擊第二個子產品值映射,會發現表輸入和值映射之間多了一個藍色箭頭,有事需要選擇主輸出步驟。通過這種方式将所有子產品串聯。如圖:

Kettle 資料遷移

上圖就代表了一個完整的表的資料交換,這時我們需要在左側欄,點選主對象樹,然後右擊DB連接配接,選擇建立,然後填入你的資料庫連接配接資訊,并測試,成功連接配接後點确認即可建立連接配接,如圖:

Kettle 資料遷移

這時,我們的準備工作基本已經就緒了,可以進行基本的資料遷移了,首先操作的是表輸入,顧名思義,表輸入代表的就是資料的來源,輕按兩下表輸入,選擇資料庫連接配接,然後寫上你要取資料的sql,然後點選預覽,可以檢視你查找到的資料,這時必須檢視資料格式,因為部分字段,如:disabled,資料庫中存的是0或1,但通過Kettle查找出來的資料中,disabled為Y或N。

Kettle 資料遷移

一般來說,能夠預覽到資料說明你的sql是對的,也就可以進行下一步了。然後我們來操作下一步:值映射,值映射就是将某些值改成另一種值,比如将Y和N映射為1和0。輕按兩下值映射,首先選擇使用的字段名,然後填上原值和目标值,點選确定即可。如圖:

Kettle 資料遷移

之後就是最重要的一步了:字段選擇,由于資料遷移時,必定很多字段存在差異,那麼如何将兩張表中的字段一一對應呢,這是就可以通過字段選擇将字段的名稱修改成我們想要的。首先,輕按兩下字段選擇,切換到第三個頁簽:中繼資料。然後點選右邊的擷取改變的字段,然後Kettle會将你sql中查詢出來的字段一一列出,在改名成那列填上你現表中的字段,類型填上對應的類型,需要注意的是Integer代表Long,Number代表Double,同時,類型也可以不填,但不建議。填完後選擇确定。如圖:

Kettle 資料遷移

這時,你會發現可能你現在的表中有很多字段是原表中沒有的,但這些字段又是不可或缺,不能為空的,那麼就需要用到增加常量這個子產品了,可以填上名稱,類型,長度,值(預設值),然後點選确定。如圖:

Kettle 資料遷移

在完成上部分操作後,基本字段是都可以對上了,但是,有些字段需要需要一些邏輯的處理,不能直接将取出來的值直接存入現表中,比如我自己的項目,我們的需求是将原來網站上的資料放到我們正在運維的新網站上,是以遷移過來的時候,現表已經存在資料,id就存在重複的現象,我們就把遷移過來的資料id直接改為負值,同時關聯的id也要改為負值,這樣就可以解決id重複,資料無法遷移的問題,同時關聯關系也不會丢掉。這時候就需要用到java代碼這個子產品了,這裡有個問題,Kettle自帶的java代碼子產品不會自動導入jar包,是以建議先在MyEclipse中寫好代碼,然後複制過來,同時需要把導入的jar包複制過來。當然,導入的jar包必須在Kettle的檔案夾下的lib檔案夾中存在。在寫代碼的時候,可以在左側欄中的input fields中輕按兩下getValue,這就是取值;在左側欄中的output fields中輕按兩下setValue,這就是指派。在寫代碼時,可以點選右下方的測試類來進行測試java代碼。是以,java代碼子產品可以用來進行邏輯的處理,如圖:

Kettle 資料遷移

經過以上的步驟,我們的資料應該已經全部修改成新表格式的資料了,那麼就可以進行最後一步表輸出了,輕按兩下表輸出,首先選擇資料庫連接配接,然後在目标表中寫上要導出的那張表,注意不要勾選裁剪表,它會将表中原有資料删掉,然後點選資料庫字段頁簽,如果需要字段有備援,需要選擇指定資料庫字段,然後點選右方擷取字段按鈕,這時需要小心排查,需要将現表中沒有的字段給删掉,右擊,删除選中行就可以了。編輯完後确定,如圖:

Kettle 資料遷移

然後在主界面點選上方的運作按鈕運作這個轉換,運作成功如圖:

Kettle 資料遷移

若是沒有錯誤出現,則代表轉換運作成功。這時就可以去檢視資料庫中的資料有沒有問題了,有問題可以再進行疊代調試。若是有錯誤出現,可以檢視下方的執行結果中的日志頁簽,這裡有比較詳細的錯誤,可以協助你的調試。

以上操作基本可以滿足資料遷移的全部需求了,多練練就行,接下來講個拓展,有時候我們在執行完所有的轉換操作後,還是無法滿足需求,比如需要在資料轉換之後進行一個sql來格式化某個字段。

第一種方法就是在執行完轉換後,直接使用Navicat執行一個sql,可以滿足需求,但需要額外的操作,其實Kettle也可以滿足我們的這個需求,Kettle在核心對象的腳本中有一個執行sql腳本。但是,如果你直接拖到表輸出的後一步,你的想法是執行完表輸出後執行sql,但Kettle的機制是隻要有sql是優先執行的,是以其實是在你插如資料之前執行了這段sql的。

那麼,應該怎麼做呢,那就要涉及到作業的概念了。作業是什麼呢,簡單了解就是很多個轉換在一起,從上往下順序執行,這不就可以解決我們的問題了麼,首先我們先建立兩個轉換,一個是正常的資料遷移,第二個就放一個執行sql腳本的子產品就可以了,寫上你再資料遷移之後需要運作的sql。如圖:

Kettle 資料遷移

然後點選左上角檔案,建立一個作業,我們隻需要在核心對象中找到通用-START和通用-轉換,然後拖一個START和兩個轉換到主面闆,然後輕按兩下轉換,第一個轉換選擇正常的資料遷移,第二個轉換選擇就一個執行sql腳本的轉換,如圖:

Kettle 資料遷移

然後我們就可以運作這個作業了,運作成功後,即可實作先進行資料遷移,在執行sql的操作,如圖:

Kettle 資料遷移

以上操作就是我使用Kettle進行老資料遷移的心得,基本滿足我的使用需求,希望也可以幫到大家。