Kettle是一個開園ETL工具,做數據倉庫用Spoon。然而網上找了很久沒有找到一個手把手教人的示例,於是自己學習的過程中把步驟都截圖保存下來了。步驟可能有點簡略,但是作為程式員肯定是能看懂的,僅供參考學習。 ...
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的能力! 僅供參考,不足之處還請見諒,歡迎指正!轉載請標明出處。如有疑問,歡迎評論或者聯繫我郵箱[email protected]