KETTLE
Kettle:簡介
ETL:簡介
ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程),對於企業或行業應用來說,我們經常會遇到各種數據的處理,轉換,遷移,所以了解並掌握一種etl工具的使用,必不可少的,Kettle就是強大的ETL工具。
Kettle:概念
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。
Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺里,然后以一種指定的格式流出。
Kettle這個ETL工具集,它允許你管理來自不同數據庫的數據,通過提供一個圖形化的用戶環境來描述你想做什么,而不是你想怎么做。
Kettle中有兩種腳本文件,transformation(.ktr)和job(.kjb),transformation完成針對數據的基礎轉換,job則完成整個工作流的控制。
Kettle:四大家族(核心組件)
Chef(中文:廚師)、Kitchen(中文:廚房)、Spoon(中文:勺子)、Pan(中文:平底鍋)
Chef—工作(job)設計工具 (GUI方式)。
Kitchen—工作(job)執行器 (命令行方式)。
Spoon—轉換(transform)設計工具 (GUI方式)。
pan—轉換(transform)執行器 (命令行方式)。
Job和Transformation的差別:Transformation專注於數據的ETL,而Job的范圍比較廣,可以是Transformation,也可以是Mail、SQL、Shell、FTP等,甚至可以是另外一個Job。
Kettle:概念模型
Kettle的執行分為兩個層次:Job和Transformation。這兩個層次的最主要的在於數據的傳遞和運行方式
1.Transformation:定義對數據操作的容器,數據操作就是數據從輸入到輸出的一個過程,可以理解為比Job粒度更小一級的容器,我們將任務分解成Job,然后需要將Job分解成一個或多個Transformation,每個Transformation只完成一部分工作。
(定義對數據操作的容器,數據操作就是數據從輸入到輸出的一個過程,可以理解為比作業粒度更小一級的容器,我們將任務分解成作業,然后需要將作業分解成一個或多個轉換,每個轉換只完成一部分工作。
)
2.Step:是Transformation內部的最小單元,每一個Step完成一個特定的功能。
3.Job:負責將Transformation組織在一起進而完成某一工作,通常我們需要把一個大的任務分解成幾個邏輯上隔離的Job,當這幾個Job都完成了,也就說明這項任務完成了。
(負責將[轉換]組織在一起進而完成某一塊工作,通常我們需要把一個大的任務分解成幾個邏輯上隔離的作業,當這幾個作業都完成了,也就說明這項任務完成了。
)
4.Job Entry:Job Entry是Job內部的執行單元,每一個Job Entry用於實現特定的功能,如:驗證表是否存在,發送郵件等。可以通過Job來執行另一個Job或者Transformation,也就是說Transformation和Job都可以作為Job Entry。
5.Hop:用於在Transformation中連接Step,或者在Job中連接Job Entry,是一個數據流的圖形化表示。
在Kettle中Job中的JobEntry是串行執行的,故Job中必須有一個Start的JobEntry;Transformation中的Step是並行執行的。
Kettle:目錄文件
Kettle:部署
安裝JDK:
由於Kettle是由java語言開發,該軟件的允許需要java運行環境的依賴,需要先安裝好JDK,准備好運行環境。
配置環境變量:
JAVA_HOME:JDK的安裝目錄
KETTLE_HOME:kettle的解壓目錄
Kettle:圖形界面
Kettle:核心概念
可視化編程:
Kettle可以被歸類為可視化編程語言(Visula Programming Languages),因為Kettle因為可以使用圖形化的方式定義復雜的ETL程序和工作流。
Kettle 里的圖就是轉換和作業
可視化編程一直是Kettle的核心概念,它可以快速構建復雜的ETL作業和減低維護工作量。它是通過隱藏很多技術細節,使IT領域更貼近於商務領域。
轉換:
轉換(Transformation)是ETL解決方案的中的最重要組成部分,它處理抽取,轉換,加載各種對數據行的操作。
轉換包含一個或者多個步驟(step),如讀取文件,過濾數據行,數據清洗,或者是將數據加載到數據庫。
轉換里的步驟通過跳(hop)來連接,跳定義了一個單項通道允許數據從一個步驟到向另一個步驟流動。
在Kettle里,數據的單位是行,數據流就是數據行從一個步驟到另一個步驟的移動。
數據流有時候被稱為記錄流
Step步驟:
步驟(控件)是轉換里的基本組成部分。
一個步驟有如下幾個關鍵的步驟特性:
- 步驟需要有一個同一的名字,這個名字在轉換范圍內唯一
- 每個步驟都會讀,寫數據行(唯一的例外就是“生成記錄”步驟,該步驟只寫數據)
- 步驟將數據寫到一個或者多個相關聯的輸出跳,再傳送到跳的另一端的步驟
- 大多數的步驟都可以有多個輸出跳。一個步驟數據發送可以被設置為分發和復制,分發是目標步驟輪流接收的記錄,復制是所有記錄被同時發送到所有的目標步驟。
Hop跳:
跳就是步驟之間帶箭頭的連線,跳定義了步驟之前的數據通路
跳實際上是兩個步驟之間的被稱為行集的數據行緩存(行集的大小可在轉換的設置里定義)
當行集滿了,向行集寫數據的步驟將停止寫入,直到行集又有空間。
當數據行空了,從行集讀取的步驟停止讀取,直到行集里又有可讀的數據行。
數據行-數據類型:
數據以數據行的形式沿着步驟移動,一個數據行時零到多個字段的集合,字段包含以下幾種類型。
- String :字符類型數據
- Number:雙精度浮點數
- Integer:帶符號的長整型(64位)
- BigNumber:任意精度數據
- Date:帶毫秒精度的日期時間值
- Boolean:取值為true和false的布爾值
- Binary:二進制字段可以包含圖片,聲音,視頻及其他類型的二進制數據
數據行-元數據:
每個步驟對在輸出數據行時都有對字段的描述,這種描述就是數據行的元數據。
包含以下一些信息。
- 名稱:行里的字段名應該是唯一的
- 數據類型:字段的數據類型
- 格式:數據顯示的方式,如Integer的#,0.00。
- 長度:字符串的長度或者是BigNumber的長度
- 精度:BigNumber類型的十進制精度
- 貨幣符號:¥
- 小數點符號:十進制數據的小數點格式。不同文化背景下小數點符號是不同的,一般是(.)或者是(,)。
- 分組符號:數值類型數據的分組符號,不同文化背景下分組符號是不同的,一般是點(.),逗號(,),單引號(‘)。
並行:
跳的這種基於行集緩存的規則允許每一個步驟都是有一個獨立的線程運行,這樣並發程度最高。這一規則也允許數據以最小的消耗內存的數據流的方式處理。在數據廠庫中我們經常處理大量數據,所以這樣並發低消耗內存的方式也是ETL工具的的核心需求。
對於Kettle的轉換,不可能定義一個執行順序,因為所有步驟都以並發方式執行:當轉換啟動后,所有步驟都同時啟動。從它們的輸入跳中讀取數據,並發處理過的數據寫到輸入跳中,知道輸入跳中不再有數據,就中止步驟的運行,當所有步驟都中止了,整個轉換也就中止了(執行順序要與數據流向分開,因為它們都是並行的操作)。
kettle輸入控件
(一)XML輸入:(控件-Get Date from Xml)
Xml: xml 是可擴展的標注語言,xml被設計用來傳輸和存儲數據.(我們要解析xml的數據就使用Xpath
)
Xpath:Xpath是xml路徑語言,它是一種用來確定xml文檔中的某些部分位置語言。
XPath基於XML樹狀結構,提供在數據結構樹中尋找節點的能力。
Xpath-語法:
選取節點Xpath使用路徑表達式在Xml中選取節點。節點是通過沿着路徑或者step
來選取的。
表達式 |
描述 |
nodename |
選取此節點的所有節點 |
/ |
從根節點開始選取 |
// |
從匹配選擇的當前節點選擇文檔中的節點,而不開路他們的位置 |
. |
選取當前節點 |
.. |
選取當前節點的父節點 |
@ |
選取屬性 |
示例:
路徑表達式 |
結果 |
bookstore |
選取bookstore元素的所有子節點 |
/bookstore |
選取根元素bookstore 注釋:加入路徑起始於正斜杠(/),則此路徑始終代表到某元素的絕對路徑 |
bookstore/book |
選取屬於bookstore的子元素的所有book元素 |
//book |
選取所有的 book 子元素,不管他們在文檔中的位置 |
Bookstore//book |
選擇屬於bookstore元素的后台的所有book元素,而不管他們位於bookstore下的任何位置 |
//@lang |
選取名為lang的所有屬性 |
實例:
- 通過輸入控件Get data from XML 獲取xml文件
- 循環讀取路徑地址
- 配置參數
- 輸出
(二)JSON輸入
JSON(JavaScript Object Notation )是一種輕量級的數據交換格式
JSON的核心概念:數組 對象 屬性
數組:[]
對象:{}
屬性:key:value
JSONPath:
JSONPath類似於XPath在xml文檔中的定位,JsonPath表達式通常是用來路徑檢索或設置JSON的。
其表達是可以接受”data-notation”(點記發)和”bracket-notation” (括號記發)格式
點記發:$.store.book[0].title
括號記發:$[‘store’][‘book’][0][‘title’]
JSONPath操作符:
符號 |
描述 |
$ |
查詢的根節點對象,用來表示一個JSON數據可以使數組或對象 |
@ |
過濾器斷言(filter predicate)處理的當前節點對象,類似於java中this字段 |
* |
通配符,可以表示一個名字或數字 |
.. |
可以理解為遞歸搜索,Deep scan.Available anywhere a name is required |
.<name> |
表示一個子節點 |
[‘<name’>(,’<name’>’)] |
表示一個或者多個子節點 |
[<number>(,<number>)] |
表示一個或者多個數組下標 |
[start:end] |
數組片段,區間為[start,end],不包含end |
[?(<expression>)] |
過濾器表達式,表達式結果必須是boolean |
示例:
實例:
- 獲取存儲JSON的.js文件,並增加到《選中的文件》
- 名稱可隨便定義,但路徑要相對匹配
- 輸出JSON數據
輸出
輸出是轉化里面的第二個分類,屬於ETL中得到L,L也就是加載(屬於數據加載的分類)。
(一)表輸出
-
首先添加Excel數據,並獲取字段信息
- 創建數據庫連接,獲取表信息。
- 啟動
轉換(重點)
Concat fields (控件)就是多個字段連接起來形成的新的字段。
值映射(控件)就是把字段的一個值映射成其他值。
增加常量(控件)就是在本身的數據流中添加一列數據,該列數據都是相同的值。
增加序列(控件)就是給數據流添加一個序列字段。
字段選擇(控件)是從數據流中選擇字段,改變名稱,修改數據類型。
計算器(控件)是一個函數集合來創建的新的字段,還可以設置字段是否刪除(臨時字段)。
剪切字符串(控件)是指定輸入吧v 流字段裁剪的位置剪切出新的字段。
字符串操作(控件)去除字符串兩端的空格和大小寫的切換並生成新的字段。
字符串替換(控件)是指定搜索內容和替換內容,如果輸入流的字段匹配上搜索內容就進行替換生成新字段。
去除重復記錄(控件)去除數據流里面相同的數據行(執行操作前,先進性排序)。
排序記錄(控件)是按照指定的字段的升序和降序對數據流排序。
唯一行(哈希值)(控件)就是刪除數據流重復的行(注意:唯一行(哈希值)和(排序記錄+去除重復記錄)效果是一樣的,但實現原理是不一樣的)。
拆分字段(控件)是把字段按照分隔符拆成兩個或者多個字段。
列拆分為多行(控件)就是把指定的分隔符的字段進行拆分為多行。
列轉行(控件)就是如果數據一列有相同的值,按照指定的字段,把多行數據轉換為一行數據.去除一些原來的列名,把一列數據變成字段。(列轉行之前對數據流進行排序)
行轉列(控件)就是把數據字段額字段名轉換為一列,把數據行變成數據列。
行扁平化(控件) 把同一組的多行數據合並為一行。 注意:只有數據流的同類數據數據行記錄一致的情況下才可使用。數據流必須進行排序
Kettle流程控件(重點)
流程主要用來控制數據流程和數據流向
Switch/Case(控件)讓數據流從一路到多路
過濾記錄(控件)從數據流從一路到兩路(很想編程的IF語句true,false)
空操作(控件)作為數據流的終點(不執行任何擦操作)
中止(控件)是數據流的終點,如果有數據到這里,將會報錯(用來檢驗數據的時候時使用)
Kettle 查詢控件(重點)
查詢是用來查詢數據源的數據並合並到主數據中。
Http client(控件)是使用Get的方式提交請求,獲取返回的頁面內容
數據庫查詢(控件)是數據庫中的左連接。
數據庫連接可以執行兩個數據庫的查詢,和單參表的表輸入
Kettle 腳本控件(重點)
腳本就是直接通過程序代碼完成一些復雜的操作。
javascript腳本
javascript腳本就是使用javascript語言通過代碼編程完成對數據流的操作。
JS中有很多內置函數,可以在編寫JS代碼時查看
存在兩種不同的模式:不兼容模式和兼容模式
不兼容模式:是默認的也是推薦的
兼容模式:兼容老版本的Ketle
獲取字段:
不兼容模式:
MyVar=filedName;(直接一個變量名)
兼容模式:根據字段類型不同使用不同方法
MyVar=filedName.getString();(字符串)
MyVar=filedName.getValue();(數字)
給字段賦值:
不兼容模式:直接使用字段名
filedName=MyVar;
兼容模式:使用
filedName.setValue(MyVar);
Java腳本
Java腳本就是使用java語言通過代碼編程來完成對數據流的操作。
內置很多函數可以使用。
Main:
main函數對應一個ProcessRow()函數,ProcessRow()函數是用來處理數據流的場所。
SQL腳本(控件)可以執行一個update語句用來更新某個表的信息
作業
簡介:大多數ETL項目都需要完成各種各樣的維護工作。
例如,如何傳送文件;驗證數據庫表的存在,等等。而這些操作都是按照一定順序完成的。因為轉換以並行方式執行,就需要一個可以串行執行的作業來處理這些操作。
一個作業包含一個或者多個作業項,這些作業項以某種順序來執行。作業執行順序由作業項之間的跳(JOB HOP)和每個作業執行結果來決定。
作業項
作業項是作業的基本構成部分,如同轉換的步驟,作業項也可以通過圖標的方式圖形化展示。
但是,如果你仔細觀察,還是會發現作業項有一些地方不同於步驟;
在作業項之間可以傳遞一個結果對象。這個結果對象里面包含了數據行,他們不是以數據流的方式來傳遞到,二十等待一個作業執行完畢后再傳遞給下一個作業。
作業跳
作業的跳是作業項之間的連接線。他定義了作業的執行路徑。作業里每個作業項的不同運行結果決定了作業的不同執行路徑。
① 無條件執行:不論上個作業項執行成功或者失敗,下一個作業項都會執行。這是一種藍色的連接線,上面有一個鎖的標。
② 當運行結果為真時執行:當上一個作業項執行結果為真時,執行下一個作業項。通常在需要無錯誤執行的情況下使用。這是一條綠色的連接線,上面有對勾號的圖標。
③ 當運行結果為假時執行:當上一個作業項執行結果為假或者沒有執行成功,執行一按一個作業項,這是一條紅色的連接線,上面有紅色停止的圖標。
參數:
對於ETL參數傳遞是一個非常重要的環節,因為參出的傳遞會涉及到業務參數是如何抽取的。
參數分為兩種:全局參數和局部參數
全局參數:定義在當前用戶下.kettle文件夾下的kettle.properties文件來定義。
定義方式是采用鍵=值的方式來定義 如:start_date=120;
注意:配置前變量后需要重啟Kettle
局部參數:是通過”Set Variables” 於”Get Variables” 方式來設置
注意:在”Set Variables”時在當前轉換不能馬上使用,需要在作業的下一個步驟執行。
參數的使用:Kettle參數的使用:(1)%%變量名%%(2)${變量名}
注意:在SQL中使用變量時需要吧“是否替換參數”勾選上,否則變量無法生效。
常量傳遞:
常量傳遞就是先自定義常量數據,在表輸入的SQl語句里面使用?來代替。
?替換的順序就是常量調用的順序。
轉換命名參數:
轉換命名參數就是在轉換內部定義的變量,作用范圍是轉換內部。
在轉換的空白處右鍵,選擇轉換設置就可以看見。
設置變量,獲取變量:
在轉換里面有一個作業分類,里面是轉換變量和設置變量的分類。
注意:“獲取變量”時在當前轉換當時是不能馬上使用的,需要在作業的下一個步驟使用
---------變量也可以作業里面設置(作業下有一個通用的模塊下的《設置變量》)