? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Kettle
1.Kettle的介紹:
Kettle是一款國(guó)外開(kāi)源的ETL工具,純java編寫(xiě),可以在Window、Linux、Unix上運(yùn)行,綠色無(wú)需安裝,數(shù)據(jù)抽取高效穩(wěn)定。
Kettle 中文名稱(chēng)叫水壺,該項(xiàng)目的主程序員MATT 希望把各種數(shù)據(jù)放到一個(gè)壺里,然后以一種指定的格式流出。
Kettle這個(gè)ETL工具集,它允許你管理來(lái)自不同數(shù)據(jù)庫(kù)的數(shù)據(jù),通過(guò)提供一個(gè)圖形化的用戶(hù)環(huán)境來(lái)描述你想做什么,而不是你想怎么做。
Kettle中有兩種腳本文件,transformation和job,transformation完成針對(duì)數(shù)據(jù)的基礎(chǔ)轉(zhuǎn)換,job則完成整個(gè)工作流的控制。
Kettle目前包含五個(gè)產(chǎn)品:Spoon、Pan、Chef、Kithcen、Encr。
SPOON:是一個(gè)圖形用戶(hù)界面,允許你通過(guò)圖形界面來(lái)設(shè)計(jì)ETL轉(zhuǎn)換過(guò)程(Transformation)和任務(wù)。
PAN:轉(zhuǎn)換(trasform)執(zhí)行器;允許你批量運(yùn)行由Spoon設(shè)計(jì)的ETL轉(zhuǎn)換 (如使用一個(gè)時(shí)間調(diào)度器)。Pan是一個(gè)后臺(tái)執(zhí)行的程序,沒(méi)有圖形界面。
CHEF:允許你創(chuàng)建任務(wù)(Job)。 任務(wù)通過(guò)允許每個(gè)轉(zhuǎn)換,任務(wù),腳本等等,更有利于自動(dòng)化更新數(shù)據(jù)倉(cāng)庫(kù)的復(fù)雜工作。任務(wù)通過(guò)允許每個(gè)轉(zhuǎn)換,任務(wù),腳本等等。任務(wù)將會(huì)被檢查,看看是否正確地運(yùn)行了。
KITHCEN:作業(yè)(job)執(zhí)行器;允許你批量使用由Chef設(shè)計(jì)的任務(wù) (如使用一個(gè)時(shí)間調(diào)度器)。KITCHEN也是一個(gè)后臺(tái)運(yùn)行的程序。
ENCR:用來(lái)加密連接數(shù)據(jù)庫(kù)密碼與集群時(shí)使用的密碼
Kettle 下載和部署:
1、我們可以進(jìn)入 Kettle官網(wǎng) 進(jìn)行下載,進(jìn)入之后,下拉頁(yè)面,看到如圖所示;
查看所有版本,我們可以看到最新版本已經(jīng)所有舊版本的Kettle
此處選擇7.1版本
2、Kettle 環(huán)境配置
由于Kettle是使用Java語(yǔ)言編寫(xiě)的,所有Kettel的運(yùn)行需要有Java環(huán)境,安裝JDK,請(qǐng)參考:Linux環(huán)境下JDK安裝和配置和Windows環(huán)境下JDK安裝和配置
3、運(yùn)行Kettle
進(jìn)入到Kettle目錄,如果Kettle部署在windows環(huán)境雙擊Spoon.bat文件啟動(dòng)Kettle,如果是在Linux環(huán)境下,則運(yùn)行spoon.sh文件啟動(dòng)。出現(xiàn)如下界面,則我們的Kettle就安裝成功了。
至此,Kettle的下載、環(huán)境配置和安裝就基本完成了。
2.Kettle入門(mén)之二 Kettle應(yīng)用場(chǎng)景(只增量插入)
在【數(shù)據(jù)整合】Kettle 應(yīng)用之一 介紹、安裝中我們已經(jīng)介紹了如何安裝Kettle工具。現(xiàn)在我們開(kāi)始使用Kettle。
Kettle應(yīng)用場(chǎng)景
示例1:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例2:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入更新到數(shù)據(jù)庫(kù)B中。
示例3:將數(shù)據(jù)源A庫(kù)中的某張表或某幾個(gè)表中的字段合并后的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例4:將數(shù)據(jù)源A庫(kù)中的某兩張或多張表級(jí)聯(lián)查詢(xún)的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中的一張表中
在此,我們主要對(duì)示例1進(jìn)行說(shuō)明。
為方便演示,我們?cè)跀?shù)據(jù)庫(kù)A和數(shù)據(jù)庫(kù)B中分別創(chuàng)建表userA和表userB。最終目標(biāo)為將數(shù)據(jù)表userA中的數(shù)據(jù)插入到數(shù)據(jù)表userB中。
create database testA;
use testA;
create table `userA` (
`id` INT (10) primary? key,
`name` VARCHAR (50),
`age` INT (3)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
insert into userA values (1, '張三', 20);
insert into userA values (2, '李四', 21);
insert into userA values (3, '王五', 22);
create database testB;
use testB;
create table `userB` (
`idB` INT (10) primary key,
`nameB` VARCHAR (50),
`ageB` INT (3)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
操作步驟
1、運(yùn)行軟件,進(jìn)入主界面。點(diǎn)擊左上角的文件 → 新建 → 轉(zhuǎn)換新建一個(gè)轉(zhuǎn)換,并保存,轉(zhuǎn)換的后綴名為ktr。
2、點(diǎn)擊面板左側(cè)的主對(duì)象樹(shù),選擇DB連接右鍵,選擇新建或新建數(shù)據(jù)庫(kù)連接向?qū)?/b>分別創(chuàng)建對(duì)數(shù)據(jù)庫(kù)A和數(shù)據(jù)庫(kù)B的連接。
選擇“新建”選項(xiàng)的操作視圖
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 1
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 2
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 3
注意:如果在點(diǎn)擊測(cè)試連接時(shí)出現(xiàn)下圖所示錯(cuò)誤,檢查我們的安裝目錄下的lib中是否有對(duì)應(yīng)數(shù)據(jù)庫(kù)連接的jar包文件(如mysql的jar文件:mysql-connector-java-5.1.6-bin.jar),下載對(duì)應(yīng)的jar,放到lib文件夾下,重啟kettle軟件,即可。
3、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇輸入文件夾下的表輸入并把它拖到右側(cè)的編輯區(qū)中。
4、雙擊編輯區(qū)的“表輸入”圖標(biāo),編輯數(shù)據(jù)輸入源。
5、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇轉(zhuǎn)換文件夾下的字段選擇并把它拖到右側(cè)的編輯區(qū)中。
6、按住shift同時(shí)鼠標(biāo)從 “testA表輸入”到“字段選擇”畫(huà)一條連接線(xiàn)。
7、雙擊編輯區(qū)的“字段選擇”,選擇“元數(shù)據(jù)”面板,點(diǎn)擊右側(cè)“獲取改變的字段”,將自動(dòng)列出輸入表中所有字段。根據(jù)要抽取的目標(biāo)表中的字段名,給每一個(gè)輸入字段修改為對(duì)應(yīng)的輸出字段。
注意:此時(shí)必須在Encoding欄中選擇輸出庫(kù)的編碼格式
image.png
8、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇輸出文件夾下的表輸出并把它拖到右側(cè)的編輯區(qū)中,按住shift劃線(xiàn)連接 “字段選擇”。
9、雙擊編輯區(qū)的“表輸出”圖標(biāo),編輯數(shù)據(jù)輸出目標(biāo)。
10、然后勾選指定數(shù)據(jù)庫(kù)字段,選擇數(shù)據(jù)庫(kù)字段,點(diǎn)擊輸入字段映射,映射輸入輸出關(guān)系。
注意:如果在點(diǎn)擊 輸入字段映射 時(shí),提示如下錯(cuò)誤:
檢查我們的數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包版本 mysql-connector-java-5.1.6-bin.jar , 因?yàn)闇y(cè)試數(shù)據(jù)庫(kù)版本為 MySQL 6.3 , 而使用此版本的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包,會(huì)在創(chuàng)建數(shù)據(jù)庫(kù)連接的時(shí)候發(fā)送測(cè)試語(yǔ)句SET OPTION SQL_SELECT_LIMIT=DEFAULT, 但是5.6及以后的版本都不再支持SET...,此時(shí),我們只需要將驅(qū)動(dòng)版本升級(jí),只需要將數(shù)據(jù)庫(kù)驅(qū)動(dòng)版本修改為5.1.22以上即可。
11、因?yàn)槲覀冊(cè)凇白侄芜x擇”中修改了每個(gè)輸入字段對(duì)應(yīng)的輸出字段的名稱(chēng),此處,我們點(diǎn)擊猜一猜,將會(huì)自動(dòng)根據(jù)字段近似度自動(dòng)匹配映射關(guān)系。
12、到這里,我們最簡(jiǎn)單的一個(gè)提取數(shù)據(jù)的轉(zhuǎn)換已經(jīng)建立完成了,點(diǎn)擊“校驗(yàn)這個(gè)轉(zhuǎn)換”,Kettle會(huì)校驗(yàn)并給出簡(jiǎn)單的報(bào)告。沒(méi)有任何問(wèn)題。
13、點(diǎn)擊“運(yùn)行這個(gè)轉(zhuǎn)換”,選擇“本地執(zhí)行”,點(diǎn)擊“啟動(dòng)”來(lái)執(zhí)行這個(gè)轉(zhuǎn)換。
14、轉(zhuǎn)換成功后,我們可以在控制臺(tái)中看到如下信息。檢查本地?cái)?shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)A的userA表中的數(shù)據(jù)已經(jīng)全部被導(dǎo)入到了數(shù)據(jù)庫(kù)B的userB表中。
注:此示例只適用于目標(biāo)表為空,或者目標(biāo)表與源表沒(méi)有主鍵沖突的情況
3. Kettle入門(mén)之三 Kettle定時(shí)任務(wù)(GUI)
有時(shí)候,需要我們建立的轉(zhuǎn)換任務(wù)能夠定時(shí)執(zhí)行,那么我們需要怎么辦呢?
此時(shí),我們需要建立一個(gè)job,來(lái)讓轉(zhuǎn)換定時(shí)執(zhí)行。
操作步驟
1、運(yùn)行軟件,進(jìn)入主界面。點(diǎn)擊左上角的文件 → 新建 → 作業(yè)(J)新建一個(gè)作業(yè)(job),并保存,作業(yè)的后綴名為kjb。
2、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇通用文件夾下的START和轉(zhuǎn)換并把它拖到右側(cè)的編輯區(qū)中,按住shift畫(huà)線(xiàn)連接“START” 和“轉(zhuǎn)換”。
3、雙擊編輯區(qū)的“START”圖標(biāo),設(shè)置定時(shí)任務(wù)。
image.png
4、雙擊編輯區(qū)的“轉(zhuǎn)換”圖標(biāo),設(shè)置要定時(shí)執(zhí)行的轉(zhuǎn)換。
5、點(diǎn)擊“Run”,選擇“本地執(zhí)行”,點(diǎn)擊“執(zhí)行”來(lái)執(zhí)行這個(gè)轉(zhuǎn)換。
image.png
6、等待設(shè)置的間隔時(shí)間后,正確執(zhí)行效果如圖
4. Kettle入門(mén)之四 Kettle定時(shí)任務(wù)(后臺(tái)任務(wù))
前面我們介紹了 Kettle的Spoon的轉(zhuǎn)換和作業(yè)定時(shí)任務(wù)GUI設(shè)計(jì)方式以及運(yùn)行,但是在實(shí)際應(yīng)用中,我們需要計(jì)劃任務(wù)是在服務(wù)器后臺(tái)運(yùn)行。
首先我們需要了解Kettle的Kitchen和Pan
Kitchen——作業(yè)(job)執(zhí)行器 (命令行方式)
Pan——轉(zhuǎn)換(trasform)執(zhí)行器 (命令行方式)
下面我們將重點(diǎn)講解經(jīng)常會(huì)用到的 ***作業(yè)執(zhí)行器 Kitchen.bat *** 。
Kitchen 參數(shù)說(shuō)明:
-rep:Repository name? 任務(wù)包所在存儲(chǔ)名
-user:Repository username? 執(zhí)行人
-pass:Repository password? 執(zhí)行人密碼
-job:The name of the job to launch 任務(wù)包名稱(chēng)
-dir:The directory (don''t forget the leading / or )
-file:The filename (Job XML) to launch
-level:The logging level (Basic, Detailed, Debug, Rowlevel, Error, Nothing) 指定日志級(jí)別
-log:The logging file to write to? 指定日志文件
-listdir:List the directories in the repository 列出指定存儲(chǔ)中的目錄結(jié)構(gòu)。
-listjobs:List the jobs in the specified directory 列出指定目錄下的所有任務(wù)
-listrep:List the defined repositories 列出所有的存儲(chǔ)
-norep:Don''t log into the repository? 不寫(xiě)日志
命令行執(zhí)行配置方式
1、新建一個(gè)bat文件,命名job.bat,然后編輯,輸入內(nèi)容如下:
d:? ? ? ? ? ? ? ? ? ## Kitchen.bat所在路徑盤(pán)符
cd D:\software\Kettle7? ? ? ## Kitchen.bat所在目錄
## 作業(yè)(job)文件路徑和日志文件路徑
## 執(zhí)行kitchen執(zhí)行job,并寫(xiě)入日志
kitchen /file:D:\KettleProject\job2.kjb /level:Base>>D:\KettleProject\test.log
注意:確保路徑的正確性。
2、雙擊job.bat,即可運(yùn)行。
后臺(tái)運(yùn)行配置方式
我們已經(jīng)建立了命令行運(yùn)行的bat文件,并且已經(jīng)可以正確執(zhí)行我們的ETL任務(wù)了,但是現(xiàn)在我們?cè)谶\(yùn)行bat后,桌面上面會(huì)一直存在一個(gè)控制臺(tái)的黑窗口,我們可以使用bat命令中的隱藏窗口的命令。
修改我們的job.bat文件
@echo offif"%1"=="h"goto beginmshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit:begin::d:## Kitchen.bat所在路徑盤(pán)符cd D:\software\Kettle7## Kitchen.bat所在目錄## 作業(yè)(job)文件路徑和日志文件路徑## 執(zhí)行kitchen執(zhí)行job,并寫(xiě)入日志kitchen/file:D:\KettleProject\job2.kjb /level:Base>>D:\KettleProject\test.log
在此雙擊job.bat運(yùn)行,我們將不會(huì)再看到控制臺(tái)黑窗口繼續(xù)保留在桌面上,并且等待設(shè)置的間隔時(shí)間后,我們可以看到日志文件記錄。
···
2017/12/07 16:51:26 - Kitchen - Logging is at level : 基本日志
2017/12/07 16:51:26 - Kitchen - Start of run.
2017/12/07 16:51:31 - job2 - 開(kāi)始執(zhí)行任務(wù)
2017/12/07 16:51:31 - job2 - job2
2017/12/07 16:53:31 - job2 - 開(kāi)始項(xiàng)[簡(jiǎn)單表同步]
2017/12/07 16:53:31 - 簡(jiǎn)單表同步 - Loading transformation from XML file [file:///D:/KettleProject/TEST2.ktr]
2017/12/07 16:53:31 - 簡(jiǎn)單表同步 - Using run configuration [Pentaho local]
2017/12/07 16:53:31 - 簡(jiǎn)單表同步 - Using legacy execution engine
2017/12/07 16:53:31 - TEST2 - 為了轉(zhuǎn)換解除補(bǔ)丁開(kāi)始? [TEST2]
2017/12/07 16:53:32 - 表輸入.0 - Finished reading query, closing connection.
2017/12/07 16:53:32 - 表輸入.0 - 完成處理 (I=3, O=0, R=0, W=3, U=0, E=0)
2017/12/07 16:53:32 - 插入 / 更新.0 - 完成處理 (I=3, O=0, R=3, W=3, U=1, E=0)
···
5. Kettle入門(mén)之五 Kettle應(yīng)用場(chǎng)景(增量插入和更新)
Kettle應(yīng)用場(chǎng)景
示例1:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例2:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入更新到數(shù)據(jù)庫(kù)B中。
示例3:將數(shù)據(jù)源A庫(kù)中的某張表或某幾個(gè)表中的字段合并后的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例4:將數(shù)據(jù)源A庫(kù)中的某兩張或多張表級(jí)聯(lián)查詢(xún)的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中的一張表中
在此,我們主要對(duì)示例2進(jìn)行說(shuō)明。
為方便演示,我們?cè)跀?shù)據(jù)庫(kù)A和數(shù)據(jù)庫(kù)B中分別創(chuàng)建表userA和表userB。最終目標(biāo)為將數(shù)據(jù)表userA中的數(shù)據(jù)插入更新到數(shù)據(jù)表userB中。
createdatabasetestA;usetestA;createtable`userA`(`id`int(10) primarykey,`name`varchar(50),`age`int(3))ENGINE=InnoDBDEFAULTCHARSET=utf8;insertintouserAvalues(1,'張三',25);insertintouserAvalues(2,'李四',29);insertintouserAvalues(3,'王五',28);insertintouserAvalues(4,'趙六',28);createdatabasetestB;usetestB;createtable`userB`(`idB`int(10) primarykey,`nameB`varchar(50),`ageB`int(3))ENGINE=InnoDBDEFAULTCHARSET=utf8;insertintouserBvalues(1,'張三',20);insertintouserBvalues(2,'李四',21);insertintouserBvalues(3,'王五',22);
操作步驟
1、運(yùn)行軟件,進(jìn)入主界面。點(diǎn)擊左上角的文件 → 新建 → 轉(zhuǎn)換新建一個(gè)轉(zhuǎn)換,并保存,轉(zhuǎn)換的后綴名為ktr。
2、點(diǎn)擊面板左側(cè)的主對(duì)象樹(shù),選擇DB連接右鍵,選擇新建或新建數(shù)據(jù)庫(kù)連接向?qū)?/b>分別創(chuàng)建對(duì)數(shù)據(jù)庫(kù)A和數(shù)據(jù)庫(kù)B的連接。
選擇“新建”選項(xiàng)的操作視圖
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 1
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 2
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 3
注意:如果在點(diǎn)擊測(cè)試連接時(shí)出現(xiàn)下圖所示錯(cuò)誤,檢查我們的安裝目錄下的lib中是否有對(duì)應(yīng)數(shù)據(jù)庫(kù)連接的jar包文件(如mysql的jar文件:mysql-connector-java-5.1.6-bin.jar),下載對(duì)應(yīng)的jar,放到lib文件夾下,重啟kettle軟件,即可。
3、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇輸入文件夾下的表輸入并把它拖到右側(cè)的編輯區(qū)中。
4、雙擊編輯區(qū)的“表輸入”圖標(biāo),編輯數(shù)據(jù)輸入源。
5、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇輸出文件夾下的插入/更新并把它拖到右側(cè)的編輯區(qū)中,按住shift畫(huà)線(xiàn)連接 “表輸入”。
6、雙擊編輯區(qū)的“插入/更新”圖標(biāo),編輯控件內(nèi)容。
用來(lái)查詢(xún)的關(guān)鍵字,此處只選擇主鍵id,表示這里按照id查詢(xún),如果此id存在,則更新數(shù)據(jù),若不存在則插入數(shù)據(jù)。
7、到這里,我們最簡(jiǎn)單的一個(gè)插入/更新數(shù)據(jù)的轉(zhuǎn)換已經(jīng)建立完成了,點(diǎn)擊“校驗(yàn)這個(gè)轉(zhuǎn)換”,Kettle會(huì)校驗(yàn)并給出簡(jiǎn)單的報(bào)告。沒(méi)有任何問(wèn)題。
8、點(diǎn)擊“運(yùn)行這個(gè)轉(zhuǎn)換”,選擇“本地執(zhí)行”,點(diǎn)擊“啟動(dòng)”來(lái)執(zhí)行這個(gè)轉(zhuǎn)換。
9、轉(zhuǎn)換成功后,我們可以在控制臺(tái)中看到如下信息。檢查本地?cái)?shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)A的userA表中的數(shù)據(jù)已經(jīng)全部被插入更新到了數(shù)據(jù)庫(kù)B的userB表中。
注:此示例適用于插入和更新目標(biāo)源數(shù)據(jù),無(wú)法將已經(jīng)源表中的刪除的記錄同步到目標(biāo)表中
need-to-insert-img
6.Kettle入門(mén)之六 Kettle應(yīng)用場(chǎng)景(字段合并)
Kettle應(yīng)用場(chǎng)景
示例1:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例2:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入更新到數(shù)據(jù)庫(kù)B中。
示例3:將數(shù)據(jù)源A庫(kù)中的某張表或某幾個(gè)表中的字段合并后的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例4:將數(shù)據(jù)源A庫(kù)中的某兩張或多張表級(jí)聯(lián)查詢(xún)的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中的一張表中
在此,我們主要對(duì)示例3進(jìn)行說(shuō)明。
為方便演示,我們?cè)跀?shù)據(jù)庫(kù)A和數(shù)據(jù)庫(kù)B中分別創(chuàng)建表userA和表userB。最終目標(biāo)為將數(shù)據(jù)表userA中的字段“surname”和“name”合并后的數(shù)據(jù)插入到數(shù)據(jù)表userB中。
createdatabasetestA;usetestA;createtable`userA`(`id`int(10) primarykey,`surname`varchar(10),`name`varchar(50),`age`int(3))ENGINE=InnoDBDEFAULTCHARSET=utf8;insertintouserAvalues(1,'張','三豐',30);insertintouserAvalues(2,'李','四光',28);insertintouserAvalues(3,'王','小米',22);createdatabasetestB;usetestB;createtable`userB`(`idB`int(10) primarykey,`nameB`varchar(50),`ageB`int(3))ENGINE=InnoDBDEFAULTCHARSET=utf8;
操作步驟
1、運(yùn)行軟件,進(jìn)入主界面。點(diǎn)擊左上角的文件 → 新建 → 轉(zhuǎn)換新建一個(gè)轉(zhuǎn)換,并保存,轉(zhuǎn)換的后綴名為ktr。
2、點(diǎn)擊面板左側(cè)的主對(duì)象樹(shù),選擇DB連接右鍵,選擇新建或新建數(shù)據(jù)庫(kù)連接向?qū)?/b>分別創(chuàng)建對(duì)數(shù)據(jù)庫(kù)A和數(shù)據(jù)庫(kù)B的連接。
選擇“新建”選項(xiàng)的操作視圖
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 1
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 2
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 3
注意:如果在點(diǎn)擊測(cè)試連接時(shí)出現(xiàn)下圖所示錯(cuò)誤,檢查我們的安裝目錄下的lib中是否有對(duì)應(yīng)數(shù)據(jù)庫(kù)連接的jar包文件(如mysql的jar文件:mysql-connector-java-5.1.6-bin.jar),下載對(duì)應(yīng)的jar,放到lib文件夾下,重啟kettle軟件,即可。
3、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇輸入文件夾下的表輸入并把它拖到右側(cè)的編輯區(qū)中。
4、雙擊編輯區(qū)的“表輸入”圖標(biāo),編輯數(shù)據(jù)輸入源。
5、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇腳本文件夾下的javaScript腳本并把它拖到右側(cè)的編輯區(qū)中,按住shift畫(huà)線(xiàn)連接 “表輸入”。
6、雙擊編輯區(qū)的“javascript腳本”,編輯腳本信息。
因?yàn)槲覀冃枰獙?“surname ” 和 “name” 合并成一個(gè)完整的姓名,所以,我們只需要在 “java script:”下的輸入框中錄入一下信息。
//聲明一個(gè)變量,用戶(hù)輸出合并列生成的姓名varallName = surname +name;
然后點(diǎn)擊獲取變量自動(dòng)將我們定義的變量輸出到字段欄中,我們可以修改字段名稱(chēng)。
7、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇輸出文件夾下的插入/更新并把它拖到右側(cè)的編輯區(qū)中,按住shift畫(huà)線(xiàn)連接 “javaScript腳本”。
8、雙擊編輯區(qū)的“插入/更新”圖標(biāo),編輯控件內(nèi)容。
用來(lái)查詢(xún)的關(guān)鍵字,此處只選擇主鍵id,表示這里按照id查詢(xún),如果此id存在,則更新數(shù)據(jù),若不存在則插入數(shù)據(jù)。
9、到這里,我們最簡(jiǎn)單的一個(gè)插入/更新數(shù)據(jù)的轉(zhuǎn)換已經(jīng)建立完成了,點(diǎn)擊“校驗(yàn)這個(gè)轉(zhuǎn)換”,Kettle會(huì)校驗(yàn)并給出簡(jiǎn)單的報(bào)告。沒(méi)有任何問(wèn)題。
10、點(diǎn)擊“運(yùn)行這個(gè)轉(zhuǎn)換”,選擇“本地執(zhí)行”,點(diǎn)擊“啟動(dòng)”來(lái)執(zhí)行這個(gè)轉(zhuǎn)換。
11、轉(zhuǎn)換成功后,我們可以在控制臺(tái)中看到如下信息。檢查本地?cái)?shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)A的userA表中的數(shù)據(jù)已經(jīng)全部被插入更新到了數(shù)據(jù)庫(kù)B的userB表中。
7.Kettle入門(mén)之七 Kettle應(yīng)用場(chǎng)景(多表級(jí)聯(lián))
Kettle應(yīng)用場(chǎng)景
示例1:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例2:將數(shù)據(jù)源A庫(kù)中的某張表的數(shù)據(jù)插入更新到數(shù)據(jù)庫(kù)B中。
示例3:將數(shù)據(jù)源A庫(kù)中的某張表或某幾個(gè)表中的字段合并后的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中。
示例4:將數(shù)據(jù)源A庫(kù)中的某兩張或多張表級(jí)聯(lián)查詢(xún)的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)B中的一張表中
在此,我們主要對(duì)示例4進(jìn)行說(shuō)明。
為方便演示,我們?cè)跀?shù)據(jù)庫(kù)A中創(chuàng)建“用戶(hù)表”、“商品表”、“訂單表”,在數(shù)據(jù)庫(kù)B中創(chuàng)建“訂單詳細(xì)信息表”。最終目標(biāo)為根據(jù)用戶(hù)表、商品表、訂單表獲取訂單詳細(xì)信息表,最終目標(biāo)結(jié)果如下。
createdatabasetestA;usetestA;-- 用戶(hù)表createtable`user`(`id`int(10) primarykey,`name`varchar(50),`age`int(3))ENGINE=InnoDBDEFAULTCHARSET=utf8;insertintouservalues(10001,'張三',20);insertintouservalues(10002,'李四',25);insertintouservalues(10003,'王五',22);-- 商品表createtable`goods`(`id`int(10) primarykey,`name`varchar(50),`price`float(16))ENGINE=InnoDBDEFAULTCHARSET=utf8;insertintogoodsvalues(1000001,'蘋(píng)果',6.5);insertintogoodsvalues(1000002,'橘子',2.5);insertintogoodsvalues(1000003,'香蕉',1.5);-- 訂單表createtable`order`(`id`int(10) primarykey,`user_id`varchar(50),`goods_id`int(10))ENGINE=InnoDBDEFAULTCHARSET=utf8;insertinto`order`values(1,10001,1000001);insertinto`order`values(2,10001,1000002);insertinto`order`values(3,10003,1000001);insertinto`order`values(4,10003,1000001);insertinto`order`values(5,10002,1000002);insertinto`order`values(6,10002,1000003);createdatabasetestB;usetestB;-- 訂單詳情表createtable`order_detail`(`id`int(10) primarykey,`user_name`varchar(50),`user_age`int(3),`goods_name`varchar(50),`goods_price`float(16))ENGINE=InnoDBDEFAULTCHARSET=utf8;
操作步驟
1、運(yùn)行軟件,進(jìn)入主界面。點(diǎn)擊左上角的文件 → 新建 → 轉(zhuǎn)換新建一個(gè)轉(zhuǎn)換,并保存,轉(zhuǎn)換的后綴名為ktr。
2、點(diǎn)擊面板左側(cè)的主對(duì)象樹(shù),選擇DB連接右鍵,選擇新建或新建數(shù)據(jù)庫(kù)連接向?qū)?/b>分別創(chuàng)建對(duì)數(shù)據(jù)庫(kù)A和數(shù)據(jù)庫(kù)B的連接。
選擇“新建”選項(xiàng)的操作視圖
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 1
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 2
選擇“新建數(shù)據(jù)庫(kù)連接向?qū)А边x項(xiàng)的操作視圖 3
注意:如果在點(diǎn)擊測(cè)試連接時(shí)出現(xiàn)下圖所示錯(cuò)誤,檢查我們的安裝目錄下的lib中是否有對(duì)應(yīng)數(shù)據(jù)庫(kù)連接的jar包文件(如mysql的jar文件:mysql-connector-java-5.1.6-bin.jar),下載對(duì)應(yīng)的jar,放到lib文件夾下,重啟kettle軟件,即可。
3、點(diǎn)擊面板左側(cè)的核心對(duì)象,選擇輸入文件夾下的表輸入并把它拖到右側(cè)的編輯區(qū)中。
4、雙擊編輯區(qū)的“表輸出”圖標(biāo),編輯數(shù)據(jù)輸入源。此處為多表聯(lián)合查詢(xún),所以表輸入我們配置的表為訂單表(關(guān)聯(lián)關(guān)系表)
5、點(diǎn)擊面板左側(cè)的** 核心對(duì)象,選擇查詢(xún) ** 文件夾下的 ** 數(shù)據(jù)庫(kù)查詢(xún) **,并把它拖到右側(cè)的編輯區(qū)中,按住 shift 畫(huà)線(xiàn)連接 “表輸入”,如下圖。
6、雙擊編輯區(qū)的“數(shù)據(jù)庫(kù)查詢(xún)”,圖標(biāo),配置級(jí)聯(lián)查詢(xún)關(guān)系。
配置用戶(hù)表關(guān)聯(lián)查詢(xún):
(1)步驟名稱(chēng)寫(xiě)入“user”,數(shù)據(jù)庫(kù)連接選擇我們user表所在的數(shù)據(jù)庫(kù),如果數(shù)據(jù)源未配置,可查看步驟2,進(jìn)行配置。
(2)選擇數(shù)據(jù)庫(kù)之后,我們通過(guò)“表名”后的 “瀏覽”按鈕,選擇我們的關(guān)聯(lián)表“user”。
(3)查詢(xún)所需關(guān)鍵,即為兩表之間的關(guān)聯(lián)字段,操作符根據(jù)需要,此處選擇 “=”。
(4) 查詢(xún)表返回的值,即為我們需要通過(guò)關(guān)聯(lián)表“user”,獲取到的字段。
類(lèi)似的,我們按照上述方法,配置商品表關(guān)聯(lián)查詢(xún)。
7、點(diǎn)擊面板左側(cè)的** 核心對(duì)象,選擇輸出 ** 文件夾下的 ** 插入/更新 **,并把它拖到右側(cè)的編輯區(qū)中,按住 shift 畫(huà)線(xiàn)連接 “數(shù)據(jù)庫(kù)查詢(xún)”(goods),如下圖。
8、雙擊右側(cè)編輯區(qū)的“查詢(xún)/更新”圖標(biāo),編輯輸出數(shù)據(jù)對(duì)應(yīng)關(guān)系。
用來(lái)查詢(xún)的關(guān)鍵字,此處只選擇主鍵id,表示這里按照id查詢(xún),如果此id存在,則更新數(shù)據(jù),若不存在則插入數(shù)據(jù)。
9、到這里,我們最簡(jiǎn)單的一個(gè)級(jí)聯(lián)查詢(xún)的轉(zhuǎn)換已經(jīng)建立完成了,點(diǎn)擊“校驗(yàn)這個(gè)轉(zhuǎn)換”,Kettle會(huì)校驗(yàn)并給出簡(jiǎn)單的報(bào)告。沒(méi)有任何問(wèn)題。
10、點(diǎn)擊“運(yùn)行這個(gè)轉(zhuǎn)換”,選擇“本地執(zhí)行”,點(diǎn)擊“啟動(dòng)”來(lái)執(zhí)行這個(gè)轉(zhuǎn)換。
11、轉(zhuǎn)換成功后,我們可以在控制臺(tái)中看到如下信息。檢查本地?cái)?shù)據(jù)庫(kù)。
此時(shí),我們看到,雖然我們的數(shù)據(jù)已經(jīng)成功提取了,但是中文部分出現(xiàn)了亂碼。
我們可以進(jìn)入主對(duì)象樹(shù) →? DB連接 → testA(數(shù)據(jù)源) ** ,雙擊“testA”,選擇“高級(jí)”,在下方輸入set names gbk; **,設(shè)置編碼格式為gbk,可以根據(jù)實(shí)際情況設(shè)置為其他編碼格式。
再次啟動(dòng)這個(gè)轉(zhuǎn)換,我們可以看到,數(shù)據(jù)已經(jīng)正常顯示。
注意:
“數(shù)據(jù)庫(kù)查詢(xún)”組件的作用是使用前面“表輸入”查詢(xún)到的一條或多條記錄再查詢(xún)其他表中的數(shù)據(jù),其本質(zhì)類(lèi)似于我們常用的Master-Detail table query,在查詢(xún)到主表的某條記錄后,自動(dòng)返回字表中匹配的記錄。
“數(shù)據(jù)庫(kù)查詢(xún)”組件的作用相當(dāng)于左連接查詢(xún),我們使用時(shí),需注意