ETL-Kettle學習筆記(入門,簡介,簡單操作)
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語句裡面使用?來代替。
?替換的順序就是常量呼叫的順序。
轉換命名引數:
轉換命名引數就是在轉換內部定義的變數,作用範圍是轉換內部。
在轉換的空白處右鍵,選擇轉換設定就可以看見。
設定變數,獲取變數:
在轉換裡面有一個作業分類,裡面是轉換變數和設定變數的分類。
注意:“獲取變數”時在當前轉換當時是不能馬上使用的,需要在作業的下一個步驟使用
---------變數也可以作業裡面設定(作業下有一個通用的模組下的《設定變數》)
結束。。。。謝謝
<