Kettle是一個開園ETL工具,做數據倉庫用Spoon。
工具:下載Spoon,解壓即可用
1、認識常用組件:
表輸入
插入\更新
數據同步
文本文件輸出
更新
自動文檔輸出
表輸出
列轉行
增加常量
增加序列
排序記錄
行轉列
過濾記錄
數據庫連接
合並記錄
排序合並
記錄關聯(笛卡爾輸出)
記錄集連接
分組
在內存中分組
2、第一個例子
生成 100 個隨機數,隨機數取值於[0,100)之間, 計算小於等於 50 的隨機數個數和 大於50 的隨機數個 數。 並把這兩個統計數字放在數據庫表的一行的兩列中, 即輸出的結果有一行,一行包括兩列,每列是一個統 計值。

1.生成隨機數,0-1區間內
2.定義常量,100
3.計算,隨機數乘以100,使得生成的數據在0~100區間內
這里后面有分支,默認是數據分發,這里要保證數據全部都流到兩條支路去要選擇復制分發模式,在計算器這個步驟上面右鍵,選擇數據發送,復制發送模式
4.條件判斷有幾種方法,這里用的是根據java代碼過濾記錄
5.分組計算總條數,4步中結果為真進分組1,否則分組2,分組里面計算總條數
6.關聯記錄
7.輸出
3、數據倉庫
目標:數據倉庫就是把別的業務組的表查出來, 再轉換, 保存到我們這邊創建的新的業務表中。后續再開發接口(http、webservice、dubbo等)給別的組調用。
3.1用戶評價表中有各種評價得分,這里對經紀人的各種得分求平均分保存到bidb_brance中

0.建立數據庫連接
數據源1:mysql://172.16.2.187:33096/jjskfang
數據源2:mysql://172.16.2.245:33096/bidb_branch
1.表輸入:
使用數據源1,
初始數據為:
SELECT ID, WORKER_ID, WORKER_NAME, USER_ID, USER_NAME, GRADE, SCORE, PROFESS_SCORE,
KNOW_SCORE, SERVICE_SCORE, TAGS, CONTENT, ORDER_ID, ORDER_TYPE, `STATUS`, MODIFY_TIME,
CREATE_TIME FROM jjskfang.CUSTOMER_COMMENT
WHERE `STATUS` = 1
2.字段選擇:
選擇必要的字段,這里也可以省略這一步
選擇:WORKER_ID, WORKER_NAME,SCORE, PROFESS_SCORE, KNOW_SCORE,SERVICE_SCORE
3.排序:選擇排序字段為WORKER_ID,分組前必須對分組字段進行排序,類似禹sql里面的group by
4.分組:根據WORKER_ID分組,同時使用聚合函數(這里就完全類似sql里面的分組和聚合函數了),如下圖:

5.計算器:用計算器計算出各個指標的平均數,如圖:

6.插入|更新:這一步將數據保存到目標數據庫中,准備工作為先在數據源2中創建需要的表:
建表如圖:

插入|更新如圖:選擇數據源2,表為剛剛創建的表

這一步根據workerId查詢判斷執行更新或者插入操作,到這里這個簡單的轉換工作就完成了,可以去數據庫里面查詢一下,看到數據都出來了是不是滿滿的成就感呢

感悟:做到這里讓我想到一個問題,以前做車輛管理系統高危用戶五級風險預警,當時是用java算出來的,真是讓人頭大。先去查詢用戶駕駛行為,再查詢用戶行為報警等各種數據,然后拼命的循壞各種判斷,得到分析后的數據再保存到另外一個表中,來來回回寫了一堆代碼,最后發現執行的時候,定時器一啟動服務啟內存就完全不夠用了,因為我開始是一次性把所有數據查出來再分析的。然后又去想怎么改程序,最終終於拼湊出來了。
現在用kettle去做貌似就簡單多了,現在感受到的是開發起來方便,干凈利落。不知道放到定時器運行的時候性能效率怎么樣?后續持續研究。
4、java調用Kettle示例
從網上復制的代碼, 后續自己寫示例驗證
public class KettleTest {
public static void main(String[] args) {
String filename = "/wang/work/study/Kettle/sample/excel_trans.ktr";
try {
KettleEnvironment.init();
EnvUtil.environmentInit();
TransMeta transMeta = new TransMeta(filename);
Trans trans = new Trans(transMeta);
trans.execute(null); // You can pass arguments instead of null.
trans.waitUntilFinished();
if ( trans.getErrors() > 0 ){
throw new RuntimeException( "There were errors during transformation execution." );
}
}
catch (KettleException e ) {
// TODO Put your exception-handling code here.
System.out.println(filename);
System.out.println(e);
}
}
}
5、java開發定時器執行ktr腳本
這個步驟省略。
總結:工具的使用並不難,關鍵在於理解業務,還有寫sql的能力!
僅供參考,不足之處還請見諒,歡迎指正!轉載請標明出處。如有疑問,歡迎評論或者聯系我郵箱
1034570286@qq.com