本人菜雞呀~今天再次記錄幾個kettle的問題!
很早以前,寫過一篇kettle的文章,當時是接手了同事的kettle流程,那時候的我完全就是kettle新人啊(雖然現在我的水平也很菜),因此匆忙的寫下了幾個自己遇見的kettle問題,文章如下:
【記錄】幾個kettle的問題:https://blog.csdn.net/lsr40/article/details/82109119
這次,其實也跟上次一樣,還是記錄幾個常見操作
1、數據庫查詢到的數據,傳入到kettle中
業務:跑數據的時候,往往會有一張維表來保存數據跑到哪裏了,通過這張表,我就知道接下來要跑哪裏的數據。
舉個例子:表A是上游表,表B是下游表,上游表的數據到了9月1號,下游表只跑到了8月25號,那麼表B就需要跑8月26號一直到9月1號的數據。
那麼怎麼把這個日期傳入到kettle裏呢?
案例1:獲得表B的最大時間,然後獲取表A中最大時間往後的數據。
看圖吧~
獲取數據的最大時間裏獲得表B的數據最大時間,然後
“獲得需要更新的時間”是一個“表輸入”,裏面獲得了表B中數據的最大時間
接着,在設置變量的ktr裏面
然後就可以在任何地方通過${max_date_id}和${month_id}來獲取到這兩個參數了!!
2、有時候,我們也需要在shell命令調用kettle任務的時候,傳入相關的參數
案例2:跑數據的日期從外部傳入(shell命令中傳入)
在kettle的入口的命名參數裏寫上外部傳入的參數名稱
接着在後面搞個獲取變量
調用的時候:
$KETTLE_HOME/kitchen.sh -file="/**/**/***數據生成(入口).kjb" --level=Rowleve -param:job_name="***數據生成(入口)" -param:date_id=20190801 -param:date_type=D
3、如何避免重複開啓相同的kettle任務
其實我們團隊的大佬是用這種方式實現的,先說下實現思路:
每個kettle任務都會給定一個名稱,當一個kettle任務開啓的時候,如果 ps -ef | grep '想查詢的kettle任務的名稱',你會發現服務器會返回8條結果給你,其中有一條是你執行ps -ef 的指令(如果把這條結果通過grep -v 去掉,那就是7條)
因此,我每次運行kettle的時候,先判斷是否是7條,如果是,證明當前任務只開啓了一次,否則就是多次,如果多次,當本次開啓就自動不執行任何結果
實現如圖:
通過javascript代碼,來登錄到執行kettle的服務器上執行查詢命令
然後通過switch/case來判斷接下來執行什麼
嗯,就是這樣子!
好,我想說的就這麼說完了,其實因爲界面畫的窗口,對於程序員來說一開始會有點不好接受,不過一旦有現成的流程,要去做一些改變,相對來說還是比較簡單的~
老話,菜雞一隻,最近也是在寫定時同步數據的kettle腳本,所以才跑來總結這篇文章的~
晚上可能要和同事跑去吃自助餐,開心的不行~趕快下班吧!!!