Kettle學(xué)習(xí)筆記(三):常用組件
目前我使用過的組件除了表輸入、表輸出、插入/更新外還有三類,下面結(jié)合實(shí)際使用說一下。
一、輸入中的excel組件
excel數(shù)據(jù)應(yīng)該是日常工作比較常用的類型,因?yàn)镺ffice在工作中可以說是無處不在。這次碰到的場(chǎng)景是把excel文件中的內(nèi)容錄入數(shù)據(jù)庫,我以前一般的處理方式是通過excel拼寫insert語句,拼裝起來是相當(dāng)?shù)膹?fù)雜。如果數(shù)據(jù)量少,我倒是愿意用excel進(jìn)行insert語句的拼裝,因?yàn)镵ettle的轉(zhuǎn)換設(shè)計(jì)也需要時(shí)間,但是如果數(shù)據(jù)量比較大,數(shù)據(jù)字段多,那么設(shè)計(jì)一個(gè)轉(zhuǎn)換流程就相當(dāng)?shù)姆奖恪?/p>
拖入輸入中的excel組件,然后右鍵,選編輯步驟。
1)文件選項(xiàng)卡,可以設(shè)置表格引擎,支持excel97-2003、excel2007、openoffice。設(shè)置表格引擎后進(jìn)行文件選擇,選擇后將文件增加到選中的文件欄。

2)工作表選項(xiàng)卡,點(diǎn)擊獲取工作表名稱,在彈出的穿梭框中移動(dòng)對(duì)應(yīng)的工作簿,然后點(diǎn)擊確定。

3)字段選項(xiàng)卡,點(diǎn)擊獲取來自頭部數(shù)據(jù)的字段,可以獲取各列的列名。這里需要注意的一點(diǎn)就是,字段類型一定要與數(shù)據(jù)庫中的類型對(duì)應(yīng),不然后面寫入數(shù)據(jù)庫會(huì)報(bào)錯(cuò)。這里修改字段類型要在原表里進(jìn)行修改,這里進(jìn)行轉(zhuǎn)換有可能會(huì)出問題。

剩下的內(nèi)容就是寫入數(shù)據(jù)庫了,用之前說過的表輸出或者插入/更新都可以。
二、連接中的記錄集連接、轉(zhuǎn)換中的計(jì)算器和字段選擇

這次的場(chǎng)景是匯總幾個(gè)業(yè)務(wù)指標(biāo)。有一個(gè)核心的業(yè)務(wù)ID,項(xiàng)目和活動(dòng)是核心業(yè)務(wù)的兩個(gè)場(chǎng)景,除了計(jì)劃培訓(xùn)人數(shù),還有實(shí)際培訓(xùn)人數(shù)與實(shí)際參考人數(shù)。我先分別通過兩個(gè)表輸入拿到項(xiàng)目計(jì)劃培訓(xùn)人數(shù)和活動(dòng)計(jì)劃培訓(xùn)人數(shù),然后進(jìn)行記錄集連接。連接的方式和數(shù)據(jù)庫的連接方式相同。

連接成功后進(jìn)入計(jì)算器。在計(jì)算器中進(jìn)行兩個(gè)數(shù)字的累加,生成新的字段。計(jì)劃人數(shù)A和計(jì)劃人數(shù)B是我在第一步表輸入中用SQL語句生成的兩個(gè)別名,方便這里進(jìn)行計(jì)算。

接下來進(jìn)入字段選擇,在計(jì)算步驟完成后,在數(shù)據(jù)流中存在5個(gè)字段。id,id_1,計(jì)劃人數(shù)A,計(jì)劃人數(shù)B,計(jì)劃人數(shù)(新增字段)。將其中的id_1,計(jì)劃人數(shù)A,計(jì)劃人數(shù)B移除掉,這樣數(shù)據(jù)流中就只存在id,計(jì)劃人數(shù)兩個(gè)字段。

到此,三個(gè)組件的使用方法已經(jīng)說完了,后面的其他流程都是這三個(gè)組件的重復(fù)使用,思路都是一樣的。下面是我在第三個(gè)字段選擇移除完成后保留的我需要的數(shù)據(jù)。

這里說一個(gè)我沒有解決的問題,在計(jì)劃人數(shù)、參培人數(shù)、參考人數(shù)合并完成后,我想求參培率(實(shí)際參培人數(shù)/計(jì)劃人數(shù))和參考率(實(shí)際參考人數(shù)/計(jì)劃人數(shù)),但是計(jì)劃人數(shù)有0的情況,我添加了計(jì)算器,但是沒有找有除0異常的解決辦法(可能可以先把為計(jì)劃人數(shù)0的篩選出去再進(jìn)行計(jì)算,待計(jì)算完成后再把計(jì)劃人數(shù)為0的合并回來,但是操作太復(fù)雜放棄了),后面的參培率和參考率計(jì)算是在BI工具中完成的。
三、輸入中的生成記錄和JSON input、查詢中的HTTP client等、腳本中的Java 代碼
這部分的場(chǎng)景就是想通過接口獲取數(shù)據(jù),因?yàn)楣ぷ魈Γ@部分又太復(fù)雜的原因,導(dǎo)致還沒有做,只是梳理出了一個(gè)思路。

1)先說下查詢,查詢中有HTTP client、HTTP post、REST client三種,HTTP client就是常見的get請(qǐng)求模式,HTTP post就是post請(qǐng)求,REST client支持多種請(qǐng)求模式。(其實(shí)下面還有數(shù)據(jù)庫查詢和數(shù)據(jù)庫連接,看起來與表輸入類似)


2)說完了查詢,說一下為什么一定要生成記錄,這是因?yàn)镵ettle中規(guī)定一定要以輸入開頭。像第二步的查詢,它不屬于輸入,所以需要添加一個(gè)生成記錄,這個(gè)生成記錄做什么用呢?在里面添加需要訪問的接口地址,然后用REST client去訪問這個(gè)地址。
3)接下來說一下整體思路。一般接口訪問都需要先鑒權(quán),鑒權(quán)后第二次再攜帶權(quán)限token再次去接口請(qǐng)求數(shù)據(jù)才可以請(qǐng)求成功。以上四個(gè)組件就是先用生成記錄填寫目標(biāo)地址,然后再通過REST client攜帶鑒權(quán)參數(shù)訪問生成記錄中的目標(biāo)地址,然后返回的結(jié)果通過JSON input進(jìn)行解析。JSON解析后拿到Token,再次發(fā)起REST client請(qǐng)求,這次可以直接將目標(biāo)地址填到REST client的地址欄直接訪問,再通過JSON input對(duì)返回的結(jié)果進(jìn)行解析,這樣就完成了通過接口獲取數(shù)據(jù)的流程。至于為什么需要腳本中的Java 代碼,是因?yàn)槟承┎襟E可能需要執(zhí)行Java代碼生成一些密鑰之類的。整體的思路基本上就是這樣,但是由于沒有時(shí)間的原因一直未真正進(jìn)行操作。
4)這里要提到一點(diǎn),就是環(huán)境一定要JDK11。我之前使用的是比較新的JDK17,Kettle的開發(fā)環(huán)境是JDK11,如果使用高版本的JDK會(huì)導(dǎo)致語法兼容性錯(cuò)誤。
以上三部分就是我這一段時(shí)間斷斷續(xù)續(xù)對(duì)Kettle的使用研究,等后面探索新功能再進(jìn)行記錄。