kettle詳解(數據抽取、轉換、裝載)


一:下載路徑

當你要學習一個工具時,往往一開始就找不到下載路徑,也不知道是為什么,連個官網都找不到,最后還是問的別人要的路徑,做程序好心酸。

http://community.pentaho.com/projects/data-integration     下載路徑

二:學習

kettle是什么?

ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程),對於企業或行業應用來說,我們經常會遇到各種數據的處理,轉換,遷移,所以了解並掌握一種etl工具的使用,必不可少。kettle支持圖形化的GUI設計界面,然后可以以工作流的形式流轉,在做一些簡單或復雜的數據抽取、質量檢測、數據清洗、數據轉換、數據過濾等方面有着比較穩定的表現,其中最主要的我們通過熟練的應用它,減少了非常多的研發工作量,提高了我們的工作效率.

 

Kettle是一款國外開源的ETL工具,純Java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。

Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺里,然后以一種指定的格式流出。

Kettle這個ETL工具集,它允許你管理來自不同數據庫的數據,通過提供一個圖形化的用戶環境來描述你想做什么,而不是你想怎么做。

Kettle中有兩種腳本文件,transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工作流的控制。

為什么使用kettle?

 

這里簡單概括一下幾種具體的應用場景,按網絡環境划分主要包括:

  • 表視圖模式:這種情況我們經常遇到,就是在同一網絡環境下,我們對各種數據源的表數據進行抽取、過濾、清洗等,例如歷史數據同步、異構系統數據交互、數據對稱發布或備份等都歸屬於這個模式;傳統的實現方式一般都要進行研發(一小部分例如兩個相同表結構的表之間的數據同步,如果sqlserver數據庫可以通過發布/訂閱實現),涉及到一些復雜的一些業務邏輯如果我們研發出來還容易出各種bug;

  • 前置機模式:這是一種典型的數據交換應用場景,數據交換的雙方A和B網絡不通,但是A和B都可以和前置機C連接,一般的情況是雙方約定好前置機的數據結構,這個結構跟A和B的數據結構基本上是不一致的,這樣我們就需要把應用上的數據按照數據標准推送到前置機上,這個研發工作量還是比較大的;

  • 文件模式: 數據交互的雙方A和B是完全的物理隔離,這樣就只能通過以文件的方式來進行數據交互了,例如XML格式,在應用A中我們開發一個接口用來生成標准格式的XML,然后用優盤或者別的介質在某一時間把XML數據拷貝之后,然后接入到應用B上,應用B上在按照標准接口解析相應的文件把數據接收過來;

綜上3種模式如果我們都用傳統的模式無疑工作量是巨大的,那么怎么做才能更高效更節省時間又不容易出錯呢?答案是我們可以用一下Kettle-_-!

使用kettle需要了解的知識?

 

ž1 Kettle使用
Kettle提供了資源庫方式的方式來整合所有的工作,但是因為資源庫移植不方便,所以我們選擇沒有資源庫;
1)創建一個新的transformation,點擊 保存到本地路徑,例如保存到D:/etltest下,保存文件名為EtltestTrans,kettle默認transformation文件保存后后綴名為ktr;
2)創建一個新的job,點擊 保存到本地路徑,例如保存到D:/etltest下,保存文件名為EtltestJob,kettle默認job文件保存后后綴名為kjb;
2 組件樹介紹

 

 

Main Tree菜單列出的是一個transformation中基本的屬性,可以通過各個節點來查看。

 

DB連接:顯示當前transformation中的數據庫連接,每一個transformation的數據庫連接都需要單獨配置。

 

Steps:一個transformation中應用到的環節列表

 

Hops:一個transformation中應用到的節點連接列表                            

 

Core Objects菜單列出的是transformation中可以調用的環節列表,可以通過鼠標拖動的方式對環節進行添加。

 

Input:輸入環節

Output:輸出環節

Lookup:查詢環節

Transform:轉化環節

Joins:連接環節

Scripting:腳本環節

 

 

 

 
 
 
 
      
4.3 Transformation轉換介紹
ž每一個環節可以通過鼠標拖動來將環節添加到主窗口中。
ž並可通過shift+鼠標拖動,實現環節之間的連接。
ž轉換常用環節介紹

類別

環節名稱

功能說明

Input

文本文件輸入

從本地文本文件輸入數據

表輸入

從數據庫表中輸入數據

獲取系統信息

讀取系統信息輸入數據

Output

文本文件輸出

將處理結果輸出到文本文件

表輸出

將處理結果輸出到數據庫表

插入/更新

根據處理結果對數據庫表機型插入更新,如果數據庫中不存在相關記錄則插入,否則為更新。會根據查詢條件中字段進行判斷

更新

根據處理結果對數據庫進行更新,若需要更新的數據在數據庫表中無記錄,則會報錯停止

刪除

根據處理結果對數據庫記錄進行刪除,若需要刪除的數據在數據庫表中無記錄,則會報錯停止

Lookup

數據庫查詢

根據設定的查詢條件,對目標表進行查詢,返回需要的結果字段

流查詢

將目標表讀取到內存,通過查詢條件對內存中數據集進行查詢

調用DB存儲過程

調用數據庫存儲過程

Transform

字段選擇

選擇需要的字段,過濾掉不要的字段,也可做數據庫字段對應

過濾記錄

根據條件對記錄進行分類

排序記錄

將數據根據某以條件,進行排序

空操作

無操作

增加常量

增加需要的常量字段

Scripting

Modified Java Script Value

擴展功能,編寫JavaScript腳本,對數據進行相應處理

Mapping

映射(子轉換)

數據映射

Job

Sat Variables

設置環境變量

Get Variables

獲取環境變量

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4.3 Job任務介紹
 

 

Main Tree菜單列出的是一個Job中基本的屬性,可以通過各個節點來查看。

 

DB連接:顯示當前Job中的數據庫連接,每一個Job的數據庫連接都需要單獨配置。

 

Job entries:一個Job中引用的環節列表

         

Job entries菜單列出的是Job中可以調用的環節列表,可以通過鼠標拖動的方式對環節進行添加。

 

每一個環節可以通過鼠標拖動來將環節添加到主窗口中。

 

並可通過shift+鼠標拖動,實現環節之間的連接。

      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ž常用環節介紹

類別

環節名稱

功能說明

Job entries

START

開始

DUMMY

結束

Transformation

引用Transformation流程

Job

引用Job流程

Shell

調用Shell腳本

SQL

執行sql語句

FTP

通過FTP下載

Table exists

檢查目標表是否存在,返回布爾值

File exists

檢查文件是否存在,返回布爾值

Javascript

執行JavaScript腳本

Create file

創建文件

Delete file

刪除文件

Wait for file

等待文件,文件出現后繼續下一個環節

File Compare

文件比較,返回布爾值

Wait for

等待時間,設定一段時間,kettle流程處於等待狀態

Zip file

壓縮文件為ZIP包

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

怎么使用kettle?

一:配置環境

 

1、安裝java JDK

1)首先到官網上下載對應JDK包,JDK1.5或以上版本就行;

2)安裝JDK;

3)配置環境變量,附配置方式:

安裝完成后,還要對它進行相關的配置才可以使用,先來設置一些環境變量,對於Java來說,最需要設置的環境變量是系統路徑變量path。

(1)要打開環境變量的設置窗口。右擊“我的電腦”,在彈出的快捷菜單中選擇“屬性”選項,進入“系統屬性”對話框,如圖所示。選擇“高級”標簽,進入“高級”選項卡,再單擊“環境變量”按鈕,進入“環境變量”對話框,如圖所示:

(2)在“Administrator的用戶變量”列表框中,選擇變量PATH,待其所在行變高亮后,單擊“編輯”按鈕,如圖所示。

(3)在彈出的“編輯系統變量”對話框中,將JDK安裝路徑下的bin目錄路徑設置到Path變量中,如圖所示。

編輯完后,單擊“確定”按鈕,進行保存,環境變量Path的設置就正式完成。

注意:設置Path變量的路徑,必須是JDK安裝目錄中的bin目錄,有時候在JDK安裝目錄的同一層會有JRE的安裝目錄,因此請謹慎選取相關路徑,避免將路徑設置成JRE目錄下的bin目錄。

3、2 測試JDK配置是否成功

設置好環境變量后,就可以對剛設置好的變量進行測試,並檢測Java是否可以運行。

(1)單擊“開始”按鈕,選擇“運行”選項,在“運行”對話框中輸入cmd命令。

(2)之后單擊“確定”按鈕,打開命令行窗口。

(3)在光標處輸入:javac命令,按下Enter鍵執行,即可看到測試結果

3、3 運行Kettle

ž進入到Kettle目錄,如果Kettle部署在windows環境下,雙擊運行spoon.bat或Kettle.exe文件,出現如下界面:

這樣配置環境這一塊基本上就完成了。

二、練習

 

功能簡述:數據庫TestA中的UserA表到數據庫TestB的UserB表;

實現流程:建立一個轉換和一個作業Job;

 

進入到Kettle目錄,如果Kettle部署在windows環境下,雙擊運行spoon.bat或Kettle.exe文件。

不輸入密碼進入,可以看到主對象樹和核心對象.

新建一個轉換后,看到轉換下有DB連接,Steps,Hops,數據庫分區schemas,子服務器,kettle集群schemas

 

 

A:建立一個轉換:打開Kettle.exe,選擇沒有資源庫,進入主界面,新建一個轉換,轉換的后綴名為ktr,轉換建立的步驟如下:

步驟1建立DB連接:創建DB連接,選擇新建DB連接,如下圖,我們輸入相應的數據庫配置信息之后點擊Test按鈕測試是否配置正確!

填入信息,最后要起連接名testA,先點擊test測試連接,如果報錯,可能是數據庫信息填的不對。

選擇連接的數據庫類型 Oracle/MySQL/

Host Name:10.8.200.105/localhost

Database Name:lifedev

Port Number:1521

User Name:...

password:...

點擊test進行連接測試。

建立好DB連接后,會出現子節點testA、testB

步驟2:建立步驟和步驟關系,

點擊核心對象,我們從步驟樹輸入中選擇【表輸入】,如下圖,這樣拖拽一個表輸入之后,我們雙擊表輸入之后,我們自己可以隨意寫一個sql語句,這個語句表示可以在這個庫中隨意組合,只要sql語句沒有錯誤即可,我這里只是最簡單的把TestA中的所有數據查出來,語句為select * from LXX_KETTLE_TESTA 

 

 

 

接下來我們創建另外一個步驟輸出中的【插入/ 更新】,然后在【表輸入】上同時按住shift鍵和鼠標左鍵滑向【插入/ 更新】,這樣建立兩個步驟之間的連接,【插入/ 更新】執行的邏輯是如果UserA表中的記錄在UserB中不存在那么就插入,如果存在就更新,如下圖,在插入更新中我們可以做一些關鍵條件和字段映射,這里我們是最簡單的!點擊保存,把我們建立的轉換保存一下。

建立好轉換之后,我們可以直接運行這個轉換,檢查一下是否有錯,如圖,有錯誤都會在下面的控制台上輸出。

點擊運行按鈕可選擇本地遠程或遠程執行或集群方式執行,我選擇本地執行,之后提示文件已經改變,在運行轉換前請先保存它,你想現在保存這個轉換嗎?可以選擇保存下來。

 

步驟三:如果我們需要讓這個轉換定時執行怎么辦呢,那么我們需要建立一個作業job

見下圖,在簡單表同步這個轉換中,我們把在A步驟中建立的ktl配置上,注意路徑的正確性;

這樣我們在【Start】步驟上面雙擊,如圖:

這樣這個作業就制定好了,點擊保存之后,我們就可以在圖形化界面上點擊開始執行了!

 

實例2:全面進階的一個稍微復雜的例子

ž根據客戶,帳戶,交易表中的數據,生成對應的數據文件,將數據文件可以導入到對應表中,並且可以用job來調用整個流程。
ž目標:
ž1),提交對應的Kettle文件
ž2),Kettle流程可以正確執行,不報錯
ž3),對應的數據文件生成並格式無誤,對應表中有數據並格式無誤
ž說明:
ž源表:數據庫etltest中存在3張表:
目標表:etltest中一張表
 
Kettle具體解決方式,步驟比較繁瑣,大家可以直接到下載中下載Demo數據庫文件和ktr、kjb來實戰測試,這樣是最好的,下面的操作僅供參考,轉換預覽圖如下:

操作步驟:
在EtltestTrans頁面下,點擊左側的【Core Objects】,點擊【Input】,選中【表
輸入】,拖動到主窗口釋放鼠標。
雙擊【表輸入】圖標
數據庫連接選擇剛剛創建好的etltest數據庫連接,在主窗口寫入對應的查詢
語句
Select * from trade ,如下圖:

點擊確定完成。
點擊核心對象->查詢,選中【數據庫查詢】,拖動到主窗口釋放鼠標。
按住shift鍵,用鼠標點中剛才創建的【表輸入】,拖動到【數據庫查詢】上,
則建立了兩個環節之間的連接,如圖:

雙擊【數據庫查詢】

步驟名稱寫入account 表查詢,數據庫連接選擇剛剛創建好的etltest 數據庫
連接,查詢的表寫入account,查詢所需的關鍵字中,表字段寫入acctno,比較
操作符寫入“=”,字段1寫入acctno。
在查詢表返回的值里面寫入custno,確定完成,如下圖:


同上,再創建一個數據庫查詢,命名為cust表查詢,查詢的表寫入cust,查
詢所需的關鍵字寫入custno=custno,查詢表返回的值寫入custname,custid,
custtype,如下圖:


點擊核心對象->Flow下過濾記錄,拖動到主窗口釋放鼠標。
點擊核心對象->腳本,選中兩個【Modified Java Script Value】,拖動到主窗
口釋放鼠標。分別雙擊打開,重命名為“對公類型修改”和“對私類型修改”。
同時,分別創建【過濾記錄】和【對公類型修改】,【對私類型修改】的連接。
雙擊過濾記錄打開。
第一個<field>里面選擇custtype,點擊<value>,在Enter value 里面寫入1,
確定,如圖:


在發送true數據給步驟里,選擇【對私類型修改】,在發送false數據給步驟
里,選擇【對公類型修改】,確定保存,如圖:


雙擊【對公類型修改】,在里面寫入javascript 腳本語句
var custtype_cn='對公客戶交易'
在字段中寫入custtype_cn,類型選為string。確定。
同理,在【對私類型修改】中,在里面寫入javascript腳本語句
var custtype_cn='對私客戶交易'
在字段中寫入custtype_cn,類型選為string。確定。
點擊左側的【Transform】,選中兩個【增加常量】,拖動到主窗口釋放鼠標。
分別雙擊打開,重命名為“增加對公常量”和“增加對私常量”。
分別建立【對公類型修改】和【對私類型修改】與【增加對公常量】和【增
加對私常量】的連接,如圖:


雙擊【增加對公常量】,名稱寫入value,類型選擇string,值寫入“這是一
筆對公客戶發生的交易”,確定保存。
同理,雙擊【增加對私常量】,名稱寫入value,類型選擇string,值寫入“這
是一筆對私客戶發生的交易”,確定保存。
點擊左側的【Output】,選中【文本文件輸出】,拖動到主窗口釋放鼠標。
建立【增加對公常量】,【增加對私常量】和【文本文件輸出】的連接,如圖:


雙擊打開【文本文件輸出】,文件名稱寫入D:\etltest\etltest.txt
點擊內容標簽,根據情況進行修改,例如
點擊字段標簽
名稱依次寫入tradeid,acctno,amt,custno,custname,custid,custtype_cn,
value,類型根據各個字段實際類型進行選擇
確定保存
點擊保存創建好的transformation。
點擊運行這個轉換。
點擊launch,開始運行
當所有狀態都變已完成時,則轉換完成,如圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM