kettle案例一抽取gz格式文字內容儲存到mongodb
版本和啟動
我們這裡使用的7.1版本,官網下載的安裝包為pdi-ce-7.1.0.0-12.zip。
安裝目錄下非常多的執行程式,但沒有明顯的啟動圖示。
Kettle常用三大家族:Spoon、Pan、Kitchen。
Spoon:通過圖形介面方式設計、執行、除錯Job與Transformation。
Pan: 通過指令碼命令方式來執行Transformation。
Kitchen: 通過指令碼命令方式來執行Job,一般就是通過呼叫Kitchen指令碼來完成定時任務。
所以對應到 目錄中的啟動檔案為:
Spoon.bat: 圖形介面方式啟動作業和轉換設計器。
Pan.bat: 命令列方式執行轉換。
Kitchen.bat: 命令列方式執行作業。
我們初級階段可以使用 圖形介面來進行操作,非常方便。
點選Spoon.bat等待啟動後如圖:
Kettle中有兩類設計分別是:Transformation(轉換)與Job(作業),Transformation完成針對資料的基礎轉換,Job則完成整個工作流的控制。
Transformation(轉換)定義對資料操作的容器,資料操作就是資料從輸入到輸出的一個過程,可以理解為比作業粒度更小一級的容器,我們將任務分解成作業,然後需要將作業分解成一個或多個轉換,每個轉換隻完成一部分工作。
也就是說 轉換可以是作業的組成部分,是作業的其中一個小步驟,作業負責把步驟連線起來。作業可以包含多個轉換。
我們要把gz的文字內容抽取出來輸出到mongodb,這個可以算作一個轉換。那麼我們滑鼠左鍵雙擊轉換即可。介面會自動跳轉到轉換的核心物件欄。
我們這裡主要會用到 輸入 轉換 輸出 因為mongodb的操作是在Big Data裡的,所以不用輸出 而是使用Big Data。
拖動元件構造流程
我們這裡主要會使用 輸入(文字檔案輸入) 轉換(拆分欄位) 和 Big Data (MongoDB Output)。
分別在裡面選取相應的元件拖入右邊的介面中。如下:
我們這裡使用的是 文字檔案輸入—->拆分欄位—>MongoDB Output,需要選中後點擊第一個按鈕,把步驟串聯起來:
連線步驟的箭頭需要正確,點選連線可以翻轉方向。
最終效果如圖:
配置輸入檔案
滑鼠左鍵雙擊文字檔案輸入,跳出配置框。
注意左上角的導航欄。
選擇檔案
點選瀏覽,選中gzip壓縮檔案,點選增加,看到檔案已經進入到選中檔案的列表中:
(看不到壓縮檔案時需要把型別改為所有檔案)
這裡的檔案目錄路徑也可以使用正則表示式萬用字元模糊匹配。
然後調試出萬用字元。
路徑為:
F:chip
我這裡檔名稱如下:
ALL.chr1.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz
ALL.chr2.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz
ALL.chrMT.phase3_callmom-v0_4.20130502.genotypes.vcf.gz
ALL.chrY.phase3_integrated_v2a.20130502.genotypes.vcf.gz
調試出的萬用字元為:
.*genotypes.vcf.gz
則選中的檔案如下:
可以點選 顯示檔名和顯示來自第一行資料行的內容 確認下是否選中正確的檔案。行數不宜太大,不然容易卡死。
顯示檔案內容 按鈕慎點,檔案太大會卡死。
檔名如下:
內容預覽如下:
選擇內容型別
點選左上角的導航欄 內容。
進入到內容配置環節。
檔案型別不csv的話可以選擇 Fixed 固定大小的檔案。
分隔符使用製表符(點選Insert TAB)分割出每一行(根據自己的檔案內容設定)
文字限定符:指定一個字串左右的限定符號,有限定符的字串裡可以使用分隔符。有限定符的字串內部如果要使用限定符,要將限定符加倍。比如”N1;N2”,如果輸入限定符為”,則輸出為N1;N2。
逃逸字元也叫轉義字元,比如,輸入逃逸字元後 輸出裡會去掉逃逸字元。比如文件內容為N1;N2
,逃逸字元為
則輸出為N1;N2。
頭部和尾部主要是表明頭部和尾部的行數。因為獲取欄位時只會展示前50行的資料,所以 如果 頭部內容超過了50行則看不到分割出的資料了。我們這裡先填250行。
壓縮選擇 檔案的壓縮格式,我這裡是gz,所以選擇GZip。
其他的可以保持不變。
最終內容配置 最終設定如圖:
選擇欄位
點選左上角的導航 欄位
點選獲取欄位
這裡發現欄位只能根據長度去分列,這種方式我們不推薦,因為長度不一時有可能分割錯誤的資料出來。
所以我們先把一整行當作一列,作為輸出,在欄位選擇環節再進行處理。
直接點選finish
設定如圖:
預覽記錄如圖:
我們後續會使用空格來進行列分割,所以這裡不去除空格,雖然看起來是沒有空格,但是 左鍵點選後發現空格還是保留了的。
過濾
在內容預覽的時候 我們發現檔案內容中有些註釋的行在頭部以#號開頭。
如果以頭部行數來跳過是一種方案,但是我們是同時多個檔案,它們的行數不一樣。
所以就不能使用頭部行數的方式了。
只能使用過濾的方式。
點選左上角導航欄的 過濾
過濾字串 表示含有 該字串的行會被過濾 我們這裡輸入#號。
過濾位置 表示過濾符號所在的位置。0表示第一個字元。 填寫小於0則表示 會搜尋整行。預設搜尋整行。
停止在過濾器 是表示 匹配到一行則停止 過濾 否表示不停止 預設為否
積極匹配 是表示 匹配到的資料行將出現在 輸出中, 否表示過濾掉這些資料,不出現在輸出中,預設為否。
我們填下如下:
設定好過濾條件後 把頭部改為0,免得資料被當作頭部過濾掉。
到這裡 我們的文字檔案輸入就做好了。
配置拆分欄位
左鍵雙擊拆分欄位後
在分隔符的地方輸入想要使用的分隔符,我這裡直接複製記錄中的空白,發現是一個製表符。
選中欄位,給出新的欄位命名
因為拆分欄位沒有自帶預覽記錄,所以需要執行一下才能看到是否拆分得正確。
對著拆分欄位右鍵,點選preview。
把行數改為3點選快速啟動
會跳出預覽資料視窗如下:
說明我們的分割是正確的。
配置MongoDB資料庫輸出
左鍵雙擊MongoDB Output
在configure connection中配置Host和Port
我這裡配置的是 內網中的資料庫和埠
在Output options中配置Database和Collection,如果每次都清空表的話 選擇 Truncate collection。增量更新則不能選擇 Truncate collection。
在Mongo document fields中點選Get fields,獲取到欄位。
啟動轉換和結果校驗
點選介面上的播放按鈕即可啟動轉換。
預設引數點選啟動。
如果轉換指令碼沒儲存會彈出選擇路徑框我們先儲存,輸入任意指令碼名稱點選儲存即可。
啟動起來後可以在執行結果的地方看到執行情況
這時候去資料庫中檢視,已經自動新建了gene庫和chip集合,裡面不斷新增的就是我們抽取的資料
抽取成功。
輸出檔名和行數作為欄位
如果需要輸出檔名和行數作為欄位,可以在內容欄裡設定。
勾選在輸出包括欄位名 名稱輸入 fileName。
勾選輸出包含行數 名稱輸入 lineNum。
勾選按檔案取行號。
設定如圖
預覽時發現已經有這兩個欄位了
這裡的檔名是包含路徑的,如果不想包含路徑則去掉勾選在輸出包括欄位名,而是在其他輸出欄位裡填寫檔名欄位名稱即可。
如下圖:
預覽如圖: