專案知識學習篇———資料清洗之kettle以及整合到java專案
一、kettle工具下載
連結: https://pan.baidu.com/s/13Mx-QJkY-5dY-nDIpuZAzw 提取碼: x146
pdi-ce-8.1.0.0.zip就是kettle軟體 下載之後解壓 進入資料夾根目錄點選Spoon.bat就能開啟客戶端
二、kettle使用
1.需要連線上兩個資料庫 一個是你想要copy的庫 還有一個是你自己的庫 我這裡是需要從一個oracle庫拿到資料 然後放入到我這邊的mysql資料庫
2.右鍵DB連線 新建連線
3.我這裡使用的是oracle和mysql需要兩個連線包 在我網盤連結裡有 ojdbc14-10.2.0.2.0.jar和mysql-connector-java-5.1.41.jar 拷貝放入到kettle的lib下上一步就可連線成功
4.然後就是兩個庫的關聯對映 點選檔案---新建----轉換 將以下兩個 表輸入和插入/更新拖到轉換之中 用shift將兩個連線起來 效果如下
5.點選表輸入 連線上你想要拷貝資料庫的源資料庫 獲取sql語句就是查詢你想要的表的資料
6.點選 插入更新 連線上你的本地資料庫 瀏覽找到對應表 關聯上兩個表的唯一標示id 類似主鍵關聯 kettle根據這個判斷插入還是更新
然後下面關聯上你想要更新的欄位點確定就可以跑起來了
7.這樣你就可以從一個庫同步資料到你的庫 你可以在你本機windows下執行也可以在linux系統下部署kettle 然後可以新建job來呼叫轉換 實現定時更新資料
儲存這個轉換你可以得到一個.ktr檔案 純Java編寫的可以整合到Java專案之中
三、整合到java專案
1.以上 的方式可以拿到資料 不過部署到linux系統由於kettle有點大 再去伺服器中呼叫 想想還是算了 還是整合到Java專案中更合理
2.整合到java專案需要幾個包
<!-- kettle相關jar包 --> <dependency> <groupId>pentaho-kettle</groupId> <artifactId>kettle-core</artifactId>
<dependency> <groupId>pentaho-kettle</groupId> <artifactId>kettle-engine</artifactId> <version>8.1.0.0-365</version> </dependency>
<dependency> <groupId>pentaho</groupId> <artifactId>metastore</artifactId> <version>8.1.0.0-365</version> </dependency>
<dependency> <groupId>org.apache</groupId> <artifactId>commons-vfs2</artifactId> <version>2.2</version> </dependency>
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>17.0</version> </dependency>
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency>
<dependency> <groupId>oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.2.0</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version> </dependency> <!-- kettle jar包結束 -->
3.jar包我分享的網盤有 國內映象沒有kettle相關包 可以把我的包加入你maven的本地倉庫中就好 有些是沒用的 根據上面我給的pom加就好
4.建立一個service類 呼叫kettle的轉換生成的.ktr檔案就可以整合到java中 然後我們可以使用spring定時排程框架Task定時呼叫這個類就實現了定時更新資料 是不是很方便啊 嘿嘿嘿
@Service("getCompanyInfoService")public class GetCompanyInfoService {
/*
//main方法用於測試 public static void main(String[] args) {
//ktr檔案路徑 String filePath =CompanyAndVehicleInfo.companyPath; //指定xml解析
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); runKtr(filePath);
}
*/
public static void runKtr() { // ktr檔案路徑 String filePath = CompanyAndVehicleInfo.companyPath; // 指定xml解析 System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); try { // 初始化 KettleEnvironment.init(); // 建立ktr元物件 TransMeta transMeta = new TransMeta(filePath); // 建立ktr Trans trans = new Trans(transMeta); // 執行ktr trans.execute(null); // 等待執行完畢 trans.waitUntilFinished(); // 判斷執行是否出錯 if (trans.getErrors() > 0) { System.err.println("檔案執行出錯!!!!!!!!"); }
} catch (KettleException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
5.Task類
@Component@EnableSchedulingpublic class CompanyAndCycleTask { @Autowired private GetCompanyInfoService getCompanyInfoService;
// 設定每天2.00 @Scheduled(cron = "0 0 2 * * ?") @Scheduled(fixedRate = 1000 * 60 * 10) public void getCompanyInformation() { getCompanyInfoService.runKtr();
}