2017-12-29

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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í),需注意

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,653評(píng)論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,063評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,835評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,235評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,459評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,819評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,004評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,257評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,676評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,937評(píng)論 1 288
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,717評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,003評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容