『壹』 如何使用kettle從資料庫中抽取數據
如果你用的是INNODB資料庫,有一個最簡單有效的調整,就是將INI文件裡面的下版面參數調整權:
原始:
innodb_flush_log_at_trx_commit=1
調整為:
innodb_flush_log_at_trx_commit=2
具體什麼意思就不解釋了,試了效果好再去找度娘
『貳』 kettle數據導出到另一個資料庫,必須先建表結構嗎
需求:
1.你是否遇到了需要將mysql資料庫中的所有表與數據遷移到Oracle。
2.你是否還在使用kettle重復的畫著:表輸入-表輸出、創建表,而煩惱。
下面為你實現了一套通用的資料庫遷移流程。
技術引導:
實現之初,在kettle提供的例子中找到了一個類似的(samples\jobs\process all tables)。
通過相關改造,終於達到目標。
實現過程解剖:
整套流程分為:2個job,4個trans。
使用到的Trans插件:表輸入、欄位選擇、復制記錄到結果、從結果獲取記錄、設置變數、自定義java腳本、表輸出。
1.大job。
2.要遷移的源庫表名稱獲取,並設置到結果集,為下面的job使用。
3.配置子job為前面的每一條記錄(即每個表)執行一次該子job
4.下面是子job。
5.獲取記錄中的表名稱,並設置為到變數。
6.讀取當前表的結果信息,並在目標庫中創建表(這個是難點)。
因為只需要獲取抓取要抽取表的結構信息,故在sql後面加上 where 1=2。
下面代碼是創建目標庫表。
Java代碼
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
// First, get a row from the default input hop
//
Object[] r = getRow();
org.pentaho.di.core.database.DatabaseMeta dbmeta = null;
java.util.List list = getTrans().getRepository().readDatabases();//3.x中獲取資源庫的所有資料庫連接信息用getDatabases();
if(list != null && !list.isEmpty())
{
for(int i=0;i<list.size();i++)
{
dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
//下面是目標庫的資料庫連接,大家可根據需要修改
if("mysql_test".equalsIgnoreCase(dbmeta.getName()))
{
break;
}
}
}
if(dbmeta!=null)
{
org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);
try
{
db.connect();
String tablename = getVariable("TABLENAME");
logBasic("開始創建表:" + tablename);
if(tablename!=null && tablename.trim().length()>0)
{
String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}
db.execStatement(sql.replace(";", ""));
logBasic(sql);
}
}
catch(Exception e)
{
logError("創建表出現異常",e);
}finally{
db.disconnect();
}
}
return false;
}
7.表數據遷移。
8.差不多就行了,本人使用mysql到mysql、oracle的測試是沒有問題的不過在測試過程中,發現源表若存在有blob的表,會有問題,可能是由於表輸出沒有指定欄位的原因,具體解決辦法,也沒有去多想,以後有時間在完善把。
上面的整套流程的是在kettle4.3下完成的,附件裡面可下載完整流程。下載地址如下:
http://download.csdn.net/detail/feng19821209/4846668
原文地址:http://ainidehsj.iteye.com/blog/1735434
『叄』 kettle怎樣連接資料庫連接
下載pdi-ce-4.4.0-stable.zip,解壓到文件夾,打開data-integration中的.bat
2
出現歡迎界面後來到Repository Connection窗口,選擇建立一個新的repository,隨後出現「資源庫信息」窗口:
在「資源庫信息」窗口中選擇新建一個資料庫連接,彈出「Database Connection」窗口:
在其中輸入Connection Name, Host Name, Database Name, Port Number, User Name,Password信息即可建立連接,完成之後在Repository Connection窗口以admin用戶名登陸。
新建一個名為cscgTransTest的Transformation,從「核心對象」中將兩個「表輸入」和一個「插入/更新」拖入到cscgTransTest中,並建立它們之間的連接,如下圖所示:
在cscgTransTest中建立一個新的資料庫連接ttt,通過表輸入「max_createtime」從目標資料庫ttt中獲取某個表中最新數據的建立時間:
SELECT max(trunc(createtime)) FROMumdata.toeventmedia
在cscgTransTest中建立一個新的資料庫連接testdb,以表輸入「max_createtime」的查詢結果替代表輸入「umdata.toeventmedia」中的變數,執行SQL語句從資料庫testdb中獲取需要插入或者更新到ttt資料庫的數據
SELECT * FROMumdata.toeventmedia where trunc(createtime) >= trunc(?)
在「插入/更新」中選擇「資料庫連接」、「目標模式」、「目標表」等信息,「用來查詢的關鍵字」中的欄位用來查詢某條記錄是否在目標表中存在,不存在則插入記錄;如果存在,則繼續比較其他欄位是否與流里的欄位值相同,如果相同則不執行任何操作,如果不同則更新「更新欄位」中所列欄位。
「用來查詢的關鍵字」所列欄位是該表的primarykey,從而可以唯一標識一條記錄。
分別為每一個表建立一個如上模式的轉換步驟。
新建一個名為「cscgJobTest」的Job,在核心對象中將「START」和「Transformation」拖入cscgJobTest中,並建立兩者之間的連接。
選中START中的「重復執行」,類型為「不需要定時」;在Transformation中將轉換名設置為之前建立的「cscgTransTest」.
點擊「Run this Job」運行。Job和Transformation的執行結果如如下:
『肆』 KETTLE 連接sql server資料庫 轉換數據
新建一個【Transformation】,在【Transform】中有知【Add sequence】組件,可以生成序道列版ID,也可以控回制資料庫的序列答ID。 後續的ID加工還可以進行組合加工,看你自己的需要權了。
『伍』 kettle 不支持什麼資料庫
Java程序連接oracle資料庫時,用oci驅動要比用thin驅動性能好些。主要的區別是使用thin驅動時,不需要安裝oracle的客戶端,而使用oci時則要安裝oracle的客戶端。
『陸』 kettle數據導出到另一個資料庫,必須先建表結構嗎
kettle數據導出到另一個資料庫,不需要先建表結構,導出方法為:
1、打開內SQL Database Studio。
『柒』 kettle中做查詢時,遇到大數據時怎麼處理
在kettle常常有處理從一個源數據中做轉換.做轉換的時候, 需要去查另一個資料庫.
這種問題遇到數據小時候還好辦. 但是數據魘 時候就麻煩來了.
下面針對三種情況做具體情況的選擇辦法
先上一個圖
[img]
[/img]
1. 當需要轉換的數據特別大的時候, 例如: 10W條以上.或者100W條以上時.
上圖中,hadoop數據導入,導入的數據如果夠多,例如100W條以上,其中一個欄位需要查詢資料庫中查詢,而這個欄位的類型並不多,例如只有10個類型或者資料庫中就只有這10個類型.那麼,可以走線路2, 並且線路2中的 "使用緩存" 可以打勾,也可以不打.當然你這個源里的數據太多,打上當然最好了.因為省得再去你的資料庫里再查.
但是當源里的數據類型還是只有10個類型,但是你的資料庫裡面存了有10000條記錄時,怎麼辦?
有兩種解決辦法:
1).線路2:並且查詢節點中的 "使用緩存" 不能打勾.
2).線路1,並在"帶條件的結果查詢供流查詢使用" 這個結點中,用一個SQL,過濾一下數據,然後盡可能地把那裡包括的這些記錄查出來.這樣在流里的比對時.也很快很多.必竟是在內存里做運算了
2. 查另一個資料庫的數據量大時,而你的源數據不大.
最好的選擇是
線路1,並在"帶條件的結果查詢供流查詢使用" 這個結點中,用一個SQL,過濾一下數據,然後盡可能地把那裡包括的這些記錄查出來.這樣在流里的比對時.也很快很多.必竟是在內存里做運算了
3. 當兩個數據源都非常大時(最不想遇到的)
這種情況是最不想遇到的辦法
一種選擇:
1).線路2中的 "使用緩存" 打勾.
當然還有別的更復雜但是會更快的辦法.適用場景比較少,不再詳細寫了.
『捌』 怎麼通過kettle 刪除mysql數據
一、准備工作
源資料庫 目標資料庫MongoDB,在源資料庫添加刪除、更新觸發器
二、操作步驟
添加表輸入組件,連接ORACLE觸發器記錄表
添加JAVA代碼組件,進行步驟跳轉,根據輸入的數據判斷是刪除或者更新,如果是刪除,則跳轉至MongoDB Delete步驟中,如果是更新的話,跳轉至欄位選擇步驟中。JAVA代碼中的詳細信息如下:
import java.util.List;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowDataUtil;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
private Object[] previousRow;//上一行
private RowSet t1 = null;//業務表步驟
private RowSet t2 = null;//刪除步驟
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
Object[] r = getRow(); //獲取輸入行
if ( first ) {
if ( getInputRowMeta() == null ) {
setOutputDone();//設置輸出完成
return false;
}
『玖』 kettle 鎖定資源資料庫,試圖獲取排他性訪問……
應該不是 這種工具在數據抽取的時候應該是多線程的 並不是逐條插入 親測orderby 無法實現
『拾』 kettle一個資料庫表數據抽取到另一個資料庫,中間想對幾個欄位下的值先進行解密再存到另一個資料庫怎麼做
Kettle學習一:簡單的表輸入輸出
1.創建兩個DB連接,test和test1,分別連接兩個不同的資料庫
2.拖拽專表輸入,欄位轉換,屬表輸出圖標到界面,並住shift鍵連接它們
3.表輸入:用於查詢出一個數據表中需要搬運的數據。
雙擊表輸入——>選擇需要搬運的資料庫(test)——>獲取 SQL查詢語句——>確定