第1章 Kettle概述
1.1 ETL簡介
ETL(Extract-Transform-Load的縮寫,即資料抽取、轉換、裝載的程序),對于企業或行業應用來說,我們經常會遇到各種資料的處理,轉換,遷移,所以了解并掌握一種ETL工具的使用,必不可少,
市面上常用的ETL工具有很多,比如Sqoop,DataX,Kettle,Talend等,作為一個大資料工程師,我們最好要掌握其中的兩到三種,這里我們要學習的ETL工具是Kettle!
1.2 Kettle簡介
1.2.1 Kettle是什么
Kettle是一款國外開源的ETL工具,純java撰寫,可以在Window、Linux、Unix上運行,綠色無需安裝,資料抽取高效穩定,
Kettle 中文名稱叫水壺,該專案的主程式員MATT 希望把各種資料放到一個壺里,然后以一種指定的格式流出,
Kettle這個ETL工具集,它允許你管理來自不同資料庫的資料,通過提供一個圖形化的用戶環境來描述你想做什么,而不是你想怎么做,
Kettle中有兩種腳本檔案,transformation和job,transformation完成針對資料的基礎轉換,job則完成整個作業流的控制,
Kettle(現在已經更名為PDI,Pentaho Data Integration-Pentaho資料集成),
1.2.2 Kettle的兩種設計

1.2.3 Kettle的核心組件

1.2.4 Kettle特點

第2章 Kettle安裝部署
2.1 Kettle下載
2.1.1 下載地址
官網地址
https://community.hitachivantara.com/docs/DOC-1009855
下載地址
https://sourceforge.net/projects/pentaho/files/Data Integration/
2.1.2 Kettle目錄說明

2.1.3 Kettle檔案說明

2.2 Kettle安裝部署
2.2.1 概述
在實際企業開發中,都是在本地Windows環境下進行kettle的job和Transformation開發的,可以在本地運行,也可以連接遠程機器運行
2.2.2 安裝
- 安裝jdk,版本建議1.8及以上
- 下載kettle壓縮包,因kettle為綠色軟體,解壓縮到任意本地路徑即可
- 雙擊Spoon.bat,啟動圖形化界面工具,就可以直接使用了
2.3 Kettle界面簡介
2.3.1 首頁

2.3.2 轉換

2.3.3 作業

2.4 Kettle轉換初次體驗
體驗案例:將csv檔案用Kettle轉換成excel檔案

1) 在Kettle中新建一個轉換,然后選擇轉換下面的“csv檔案輸入”和“Excel輸出”控制元件

2) 雙擊CSV檔案輸入檔案控制元件,在彈出的設定框里找到對應的csv檔案(尚硅谷大資料技術之Kettle\5.資料\input\01_kettle快速體驗.csv),然后點擊下面的獲取欄位按鈕,將我們需要的欄位加載到kettle中

3)按住鍵盤SHIFT鍵,并且點擊滑鼠左鍵將兩個控制元件鏈接起來,鏈接時選擇“主輸出步驟”


4)雙擊Excel輸出控制元件,在彈出的設定框里設定檔案輸出路徑和檔案名稱,然后點擊上面的欄位框,依次點擊下面的獲取欄位和最小寬度,獲取到輸出欄位,

5)點擊左上角的啟動按鈕,在彈出的設定框里點擊啟動,執行該轉換,

6)查看kettle下方執行結果日志以及輸出路徑的Excel檔案內容


2.5 Kettle核心概念
2.5.1 可視化編程
Kettle可以被歸類為可視化編程語言(Visula Programming Languages,VPL),因為Kettle可以使用圖形化的方式定義復雜的ETL程式和作業流,
可視化編程一直是Kettle里的核心概念,它可以讓你快速構建復雜的ETL作業和減低維護作業量,它通過隱藏很多技術細節,使IT領域更貼近于商務領域,
Kettle里的代碼就是轉換和作業,
2.5.2 轉換
轉換(transaformation)負責資料的輸入、轉換、校驗和輸出等作業,Kettle 中使用轉換完成資料 ETL 全部作業,轉換由多個步驟 (Step) 組成,如文本檔案輸入,過濾輸出行,執行 SQL 腳本等,各個步驟使用跳 (Hop) 來鏈接, 跳定義了一個資料流通道,即資料由一個步驟流 (跳) 向下一個步驟,在 Kettle 中資料的最小單位是資料行(row),資料流中流動其實是快取的行集 (RowSet) ,

2.5.3 步驟(Step)
步驟(控制元件)是轉換里的基本的組成部分,快速入門的案例中就存在兩個步驟,“CSV檔案輸入”和“Excel輸出”,
一個步驟有如下幾個關鍵特性:
①步驟需要有一個名字,這個名字在同一個轉換范圍內唯一,
②每個步驟都會讀、寫資料行(唯一例外是“生成記錄”步驟,該步驟只寫資料),
③步驟將資料寫到與之相連的一個或多個輸出跳(hop),再傳送到跳的另一端的步驟,
④大多數的步驟都可以有多個輸出跳,一個步驟的資料發送可以被設定為分發和復制,分發是目標步驟輪流接收記錄,復制是所有的記錄被同時發送到所有的目標步驟,


2.5.4 跳(Hop)
跳就是步驟之間帶箭頭的連線,跳定義了步驟之間的資料通路,

跳實際上是兩個步驟之間的被稱之為行集的資料行快取,行集的大小可以在轉換的設定里定義,當行集滿了,向行集寫資料的步驟將停止寫入,直到行集里又有了空間,當行集空了,從行集讀取資料的步驟停止讀取,直到行集里又有可讀的資料行,

2.5.5 元資料
每個步驟在輸出資料行時都有對欄位的描述,這種描述就是資料行的元資料,
通常包含下面一些資訊,
①名稱:資料行里的欄位名是唯一的,
②資料型別:欄位的資料型別,
③格式:資料顯示的方式,如Integer的#、0.00,
④長度:字串的長度或者BigNumber型別的長度,
⑤精度:BigNumber資料型別的十進制精度,
⑥貨幣符號:¥
⑦小數點符號:十進制資料的小數點格式,不同文化背景下小數點符號是不同的,一般是點(.)或逗號(,),
⑧分組符號:數值型別資料的分組符號,不同文化背景下數字里的分組符號也是不同的,一般是點(.)或逗號(,)或單引號(’)

2.5.6 資料型別
資料以資料行的形式沿著步驟移動,一個資料行是零到多個欄位的集合,欄位包含下面幾種資料型別,
①String:字符型別資料
②Number:雙精度浮點數,
③Integer:帶符號長整型(64位),
④BigNumber:任意精度資料,
⑤Date:帶毫秒精度的日期時間值,
⑥Boolean:取值為true和false的布林值,
⑦Binary:二進制欄位可以包含影像、聲音、視頻及其他型別的二進制資料,

2.5.7 并行
跳的這種基于行集快取的規則允許每個步驟都是由一個獨立的執行緒運行,這樣并發程度最高,這一規則也允許資料以最小消耗記憶體的資料流的方式來處理,在資料倉庫里,我們經常要處理大量資料,所以這種高并發低消耗的方式也是ETL工具的核心需求,
對于kettle的轉換,不能定義一個執行順序,因為所有步驟都以并發方式執行:當轉換啟動后,所有步驟都同時啟動,從它們的輸入跳中讀取資料,并把處理過的資料寫到輸出跳,直到輸入跳里不再有資料,就中止步驟的運行,當所有的步驟都中止了,整個轉換就中止了,
如果你想要一個任務沿著指定的順序執行,那么就要使用下面所講的“作業”!
2.5.8 作業
作業 (Job),負責定義一個完成整個作業流的控制,比如將轉換的結果發送郵件給相關人員,因為轉換(transformation)以并行方式執行,所以必須存在一個串行的調度工具來執行轉換,這就是 Kettle中的作業,
第3章 Kettle轉換
3.1 Kettle輸入控制元件
輸入是轉換里面的第一個分類,輸入控制元件也是轉換中的第一大控制元件,用來抽取資料或者生成資料,輸入是ETL里面的E(Extract),主要做資料提取的作業,

由于Kettle中自帶的輸入控制元件比較多,本文只挑出開發中經常使用的幾個輸入控制元件來進行講解,詳情如下圖,

3.1.1 CSV檔案輸入
CSV檔案是一個用逗號分隔的固定格式的文本檔案,這種檔案后綴名為.csv,可以用Excel或者文本編輯器打開,在企業里面一般最常見的ETL需求就是將csv檔案轉換為excel檔案,如果用Kettle來做這個ETL作業,就需要用到本章節講解的CSV檔案輸入控制元件,
本章節任務:熟悉CSV檔案輸入控制元件,并嘗試將CSV檔案轉換成Excel檔案(可參考上面的快速體驗案例),

① 步驟名稱:可以修改,但是在同一個轉換里面要保證唯一性,見名知意;
② 檔案名:選擇對應的csv檔案;
③ 列分隔符:默認是逗號;
④ 封閉符:結束行資料的讀寫;
⑤ NIO快取大小:檔案如果行數過多,需要調整此引數;
⑥ 包含列頭行:意思是檔案中第一行是欄位名稱行,表頭不進行讀寫;
⑦ 行號欄位:如果檔案第一行不是欄位名稱或者需要從某行開始讀寫,可在此輸入行號,
⑧ 并發運行?:選擇并發,可提高讀寫速度;
⑨ 欄位中有回車換行?:不要選擇,會將換行符做資料讀出;
⑩ 檔案編碼:如果預覽資料出現亂碼,可更換檔案編碼;
3.1.2 文本檔案輸入
提取服務器上的日志資訊是公司里ETL開發很常見的操作,日志資訊基本上都是文本型別,因此文本檔案輸入控制元件是kettle中常用的一個輸入控制元件,使用文本檔案輸入控制元件步驟:
1) 添加需要轉換的日志檔案
2) 按照日志檔案格式,指定分隔符
3) 獲取下欄位,并給欄位設定合適的格式
4) 最后點下預覽記錄,看看能否讀到資料



本章節任務:熟悉文本檔案輸入控制元件,并新建轉換,將txt日志檔案轉換為Excel檔案

3.1.3 Excel輸入
Excel輸入控制元件也是很常用的輸入控制元件,一般企業里會用此控制元件對大量的Excel檔案進行ETL操作,使用Excel輸入控制元件步驟如下:
1) 按照讀取的源檔案格式指定對應的表格型別為xls還是xlsx
2) 選擇并添加對應的excel檔案
3) 獲取excel的sheet作業表
4) 獲取欄位,并給每個欄位設定合適的格式
5) 預覽資料



本章節任務:熟悉Excel輸入控制元件,將excel檔案的兩個sheet表格的資料重新寫到一個新的excel檔案中

3.1.4 XML輸入
1)XML簡介
XML-可擴展標記語言eXtensible Markup Language,由W3C組織發布,目前推薦遵守的是W3C組織于2000年發布的XML1.0規范,XML用來傳輸和存盤資料,就是以一個統一的格式,組織有關系的資料,為不同平臺下的應用程式服務,

2) XPath簡介
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML檔案中某部分位置的語言,XPath基于XML的樹狀結構,提供在資料結構樹中找尋節點的能力,
XPath 使用路徑運算式在 XML 檔案中選取節點,下面列出了最有用的路徑運算式:

3) XML輸入控制元件
了解XML和XPath概念以后,我們要開始學習Kettle的XML輸入控制元件,企業里經常用此控制元件進行XML檔案的ETL操作,
- 瀏覽獲取xml檔案,將xml檔案添加到kettle中
- 獲取xml檔案的所有路徑,設定合適的回圈讀取路徑
- 獲取欄位,獲得自己想要讀取的所有欄位,并且設定適當的格式
- 預覽資料,看看能否讀取到自己想要的資料



本章節任務:熟悉XML輸入控制元件,將XML檔案的學生資料寫到excel檔案中

3.1.5 JSON輸入
1)JSON簡介
JSON(JavaScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式,JSON物件本質上就是一個JS物件,但是這個物件比較特殊,它可以直接轉換為字串,在不同語言中進行傳遞,通過工具又可以轉換為其他語言中的物件,
JSON核心概念:陣列、物件、屬性,
陣列:[ ]
物件:{ }
屬性:key:value
2)JSON Path
JSONPath類似于XPath在xml檔案中的定位,JsonPath運算式通常是用來路徑檢索或設定Json的,其運算式可以接受“dot–notation”(點記法)和“bracket–notation”(括號記法)格式
點記法:$.store.book[0].title
括號記法:$[‘store’][‘book’][0][‘title’]

3) JSON輸入控制元件
了解JSON格式和JSON Path以后,我們要學習使用JSON輸入控制元件,JSON控制元件也是企業里做ETL常用的控制元件之一,
- 瀏覽獲取JSON檔案,將json檔案獲取到kettle中
- 根據JSON Path點記法,獲取到需要的欄位,并且設定合適格式




本章節任務:獲取到JSON檔案里面的id,field,value欄位,寫到excel檔案中

3.1.6 表輸入
1)創建資料庫連接
表輸入可以說是kettle中用到最多的一種輸入控制元件,因為企業中大部分的資料都會存在資料庫中,kettle可以連接市面上常見的各種資料庫,比如Oracle,Mysql,SqlServer等,但是在連接各個資料庫之前,我們需要先配置好對應的資料庫驅動,本教程以mysql為例,給大家講解kettle連接mysql資料庫的程序,
首先我們要將對應版本的mysql連接驅動放到kettle安裝目錄下面的lib檔案夾下,然后重啟kettle的客戶端Spoon

重啟Spoon客戶端以后,我們就可以創建對應的資料庫連接了,在轉換視圖的主物件樹目錄下,有個DB連接,右鍵然后選擇新建,在打開資料庫連接框里,填寫正確的資料庫資訊,然后測驗,測驗無誤后,可以保存此資料庫連接,


資料庫連接默認只對本轉換有效,換一個轉換以后,這個連接就沒法用了,還需要新建資料庫連接,所以我們需要將建好的這個資料庫連接進行共享下,共享以后,其他的轉換也能用我們提前建好的這個資料庫連接了,

2)表輸入
創建好資料庫連接以后,我們就可以使用表輸入控制元件了,雙擊表輸入控制元件,選擇剛剛創建的資料庫連接,然后在SQL框里輸入合適的查詢陳述句,然后點擊預覽按鈕,看能否預覽到我們期望的資料,


本章節任務:根據自己的集群環境,創建資料庫連接,然后使用表輸入控制元件將student表的資料寫到excel中,

3.2 Kettle輸出控制元件
輸出是轉換里面的第二個分類,輸出控制元件也是轉換中的第二大控制元件,用來存盤資料,輸出是ETL里面的L(Load),主要做資料加載的作業,
由于Kettle中自帶的輸出控制元件比較多,本文只挑出開發中經常使用的幾個輸出控制元件來進行講解,詳情如下圖,

3.2.1 Excel輸出
Kettle中自帶了兩個Excel輸出,一個Excel輸出,另一個是Microsoft Excel輸出,
Excel輸出只能輸出xls檔案(適合Excel2003),Microsoft Excel輸出可以輸出xls和xlsx檔案(適合Excel2007及以后)
Excel輸出大家已經很熟悉了,本章不再贅述,接下來給大家講下Microsoft Excel輸出,
1) 選擇合適的擴展名
2) 點擊瀏覽,補全輸出檔案的路徑已經檔案名

本章任務:使用表輸入控制元件,將student表的資料,以復制的方式輸出到xls和xlsx檔案中

3.2.2 文本檔案輸出
文本檔案輸出控制元件,顧名思義,這是一個能將資料輸出成文本的控制元件,比較簡單,在企業里面也比較常用,
1. 設定對應的目錄和檔案名
2. 設定合適的擴展名,比如txt,csv等
3. 在內容框里設定合適的分隔符,比如分號,逗號,TAB等
4. 在欄位框里獲取欄位,并且給每個欄位設定合適的格式



本章節任務:將student表的資料復制兩份,匯出成txt和csv檔案

3.2.3 SQL檔案輸出
SQL檔案輸出一般跟表輸入做連接,然后將資料庫表的表結構和資料以sql檔案的形式匯出,然后做資料庫備份的這么一個作業,
1. 選擇合適的資料庫連接
2. 選擇目標表
3. 勾選增加創建表陳述句和每個陳述句另起一行
4. 填寫輸出檔案的路徑和檔案名
5. 擴展名默認為sql,這個不需要更改

本章節任務:將student表的表結構和資料利用kettle匯出成sql檔案備份

3.2.4 表輸出
表輸出控制元件可以將kettle資料行中的資料直接寫入到資料庫中的表中,企業里做ETL作業會經常用到此控制元件,
1. 選擇合適的資料庫連接
2. 選擇目標表,目標表可以提前在資料庫中手動創建好,也可以輸入一個資料庫不存在的表,然后點擊下面的SQL按鈕,利用kettle現場創建
3. 如果目標表的表結構和輸入的資料結構不一致,還可以自己指定資料庫欄位

本章節任務:熟悉表輸出控制元件,然后將student表的資料匯入到student2表中,要求利用kettle現場創建student2表

3.2.5 更新&插入/更新
更新和插入/更新,這兩個控制元件是kettle提供的將資料庫已經存在的記錄與資料流里面的記錄進行對比的控制元件,企業級ETL經常會用到這兩個控制元件來進行資料庫更新的操作
兩者區別:
更新是將資料庫表中的資料和資料流中的資料做對比,如果不同就更新,如果資料流中的資料比資料庫表中的資料多,那么就報錯,
插入/更新的功能和更新一樣,只不過優化了資料不存在就插入的功能,因此企業里更多的也是使用插入/更新,


1. 選擇正確的資料庫連接
2. 選擇目標表
3. 輸入兩個表來進行比較的欄位,一般來說都是用主鍵來進行比較
4. 輸入要更新的欄位
本章節任務:手動修改下student表的資料(修改和新增),然后用修改后的資料和student2來進行對比,分別嘗試更新和插入/更新控制元件的區別


3.2.6 洗掉
洗掉控制元件可以洗掉資料庫表中指定條件的資料,企業里一般用此控制元件做資料庫表資料洗掉或者跟另外一個表資料做對比,然后進行去重的操作,
1. 選擇資料庫連接
2. 選擇目標表
3. 設定資料流跟目標表要洗掉資料的對應欄位

本章節任務:洗掉student2表格中student表里面已有的資料(按照student表對student2表資料進行去重)

3.3 Kettle轉換控制元件
轉換控制元件是轉換里面的第四個分類,轉換控制元件也是轉換中的第三大控制元件,用來轉換資料,轉換是ETL里面的T(Transform),主要做資料轉換,資料清洗的作業,ETL整個程序中,Transform的作業量最大,耗費的時間也比較久,大概可以占到整個ETL的三分之二,
由于Kettle中自帶的轉換控制元件比較多,本文只挑出開發中經常使用的幾個轉換控制元件來進行講解,詳情如下圖,

3.3.1 Concat fields
轉換控制元件Concat fields,顧名思義,就是將多個欄位連接起來形成一個新的欄位,
本章節任務:將staff表的firstname和lastname拼接起來,形成name欄位,然后再將資料插入到新表emp中
提示:如果涉及到中文亂碼問題,請參考資料:Mysql中文亂碼問題.docx

3.3.2 值映射
值映射就是把欄位的一個值映射成其他的值,在資料質量規范上使用非常多,比如很多系統對應性別sex欄位的定義不同,所以我們需要利用此控制元件,將同一個欄位的不同的值,映射轉換成我們需要的值,
1. 選擇映射的欄位
2. 還可以自定義映射完以后的新欄位名
3. 可以設定不匹配時的默認值
4. 設定映射的值

本章節任務:將staff表的sex欄位,映射成男or女,然后再插入到emp表中

3.3.3 增加常量&增加序列
增加常量就是在本身的資料流里面添加一列資料,該列的資料都是相同的值,
增加序列是給資料流添加一個序列欄位,可以自定義該序列欄位的遞增步長,


本章節任務:給表staff的資料加一列固定值slary和一個遞增的number序列,在控制臺預覽下資料即可,不用輸出,

3.3.4 欄位選擇
欄位選擇是從資料流中選擇欄位、改變名稱、修改資料型別,



本章節任務:在上一章節的轉換之后,添加欄位選擇控制元件,移除掉firstname欄位,并且將lastname重命名為name,將slary重命名為money,然后再次預覽資料,查看資料的變化

3.3.5 計算器
計算器是一個函式集合來創建新的欄位,還可以設定欄位是否移除(臨時欄位),我們可以通過計算器里面的多個計算函式對已有欄位進行計算,得出新欄位,


本章節任務:在上一節的任務基礎之上,添加計算器控制元件對money和number欄位進行相乘,得出新欄位acount,然后預覽資料,


3.3.6 字串剪切&替換&操作
轉換控制元件中有三個關于字串的控制元件,分別是剪切字串,字串操作,字串替換
剪切字串是指定輸入流欄位裁剪的位置剪切出新的欄位,

字串替換是指定搜索內容和替換內容,如果輸入流的欄位匹配上搜索內容就進行替換生成新欄位,

字串操作是去除字串兩端的空格和大小寫切換,并生成新的欄位,

本章節任務:在上一節任務之后,添加剪切字串,字串替換,字串操作三個控制元件,利用這三個控制元件分別對sex欄位進行剪切,替換,操作(去空格,轉大小寫)


3.3.7 排序記錄&去除重復記錄
去除重復記錄是去除資料流里面相同的資料行,但是此控制元件使用之前要求必須先對資料進行排序,對資料排序用的控制元件是排序記錄,排序記錄控制元件可以按照指定欄位的升序或者降序對資料流進行排序,因此排序記錄+去除重復記錄控制元件常常配合組隊使用,


本章節任務:利用excel輸入控制元件讀取input目錄下的06_去除重復記錄.xlsx,然后對里面重復的資料進行按照id排序并去重

3.3.8 唯一行(哈希值)
唯一行(哈希值)就是洗掉資料流重復的行,此控制元件的效果和(排序記錄+去除重復記錄)的效果是一樣的,但是實作的原理不同,排序記錄+去除重復記錄對比的是每兩行之間的資料,而唯一行(哈希值)是給每一行的資料建立哈希值,通過哈希值來比較資料是否重復,因此唯一行(哈希值)去重效率比較高,也更建議大家使用,

本章節任務:利用唯一行(哈希值)控制元件對06_去除重復記錄.xlsx去重,并且查看最后輸出的資料跟上個任務有何區別

3.3.9 拆分欄位
拆分欄位是把欄位按照分隔符拆分成兩個或多個欄位,需要注意的是,欄位拆分以后,原欄位就會從資料流中消失,

本章節任務:將07_拆分欄位.xlsx里面的NBA球星的姓名,拆分成姓跟名,

3.3.10 列拆分為多行
列拆分為多行就是把指定欄位按指定分隔符進行拆分為多行,然后其他欄位直接復制,具體效果如下圖:


1. 選擇要拆分的欄位
2. 設定合適的分割符
3. 設定分割以后的新欄位名
4. 選擇是否輸出新資料的排列行號,行號是否重置

本章節任務:對08_列拆分為多行.xlsx的資料按照hobby欄位進行拆分為多行,然后將新資料輸出到excel檔案中,查看資料,

3.3.11 行扁平化
行扁平化就是把同一組的多行資料合并成為一行,可以理解為列拆分為多行的逆向操作,但是需要注意的是行扁平化控制元件使用有兩個條件:
- 使用之前需要對資料進行排序
- 每個分組的資料條數要保證一致,否則資料會有錯亂

1. 選擇扁平化的欄位
2. 填寫目標欄位,欄位個數跟每個分組的資料一致
本章節任務:將09_行扁平化.xlsx的資料按照hobby欄位進行扁平化

3.3.12 列轉行
列轉行,顧名思義多列轉一行,就是如果資料一列有相同的值,按照指定的欄位,將其中一列的欄位內容變成不同的列,然后把多行資料轉換為一行資料的程序,具體效果如下圖:


注意:列轉行之前資料流必須按照分組欄位進行排序,否則資料會錯亂!

1. 關鍵欄位:從資料內容變成列名的欄位
2. 分組欄位:列轉行,轉變以后的分組欄位
3. 目標欄位:增加的列的列名欄位
4. 資料欄位:目標欄位的資料欄位
5. 關鍵字值:資料欄位查詢時的關鍵字,也可以理解為key
6. 型別:要給目標欄位設定合適的型別,否則會報錯
本章節任務:將input目錄下的10_列轉行.xlsx的資料進行列轉行,熟悉列轉行控制元件的使用

3.3.13 行轉列
行轉列,一行轉多列,就是把資料欄位的欄位名轉換為一列,把資料行變為資料列,我們也可以簡單理解為行轉列控制元件是列轉行控制元件的逆向操作,具體如下圖:



1. Key欄位:行轉列,生成的列名欄位名
2. 欄位名稱:原本資料流中的欄位名
3. Key值:Key欄位的值,這個是自己自定義的,一般都跟前面的欄位名稱一樣
4. Value欄位:對應的Key值的資料列的列名
本章節任務:將input目錄下的11_行轉列.xlsx用excel控制元件輸入,然后行轉列,熟悉行轉列控制元件的使用,

3.4 Kettle應用控制元件
應用是轉換控制元件里面的第五個分類,這個分類下是Kettle給我們自帶的一些工具類
3.4.1 替換NULL值
替換NULL值,顧名思義就是將資料里面的null值替換成其他的值,此控制元件比較簡單,但是在企業里面也會經常用到,
1. 可以選擇替換資料流中所有欄位的null值
2. 也可以選擇欄位,在下面的欄位框里面,根據不同的欄位,將null值替換成不同的值

本章節任務:替換excel資料12_替換NULL值.xlsx的bonus列的null值為0

3.4.2 寫日志
寫日志控制元件主要是除錯的時候使用,此控制元件可以將資料流的每行資料列印到控制臺,方便我們除錯整個程式,
1. 選擇日志級別
2. 可以輸入自定義輸出的陳述句
3. 選擇要輸出列印的欄位


本章節任務:在上個任務的基礎之上,添加寫日志控制元件,在控制臺輸出查看資料,

3.5 Kettle流程控制元件
流程是轉換里面的第六個分類,流程分類下的控制元件主要用來控制資料流程和資料流向,
3.5.1 Switch/case
Switch/case控制元件,最典型的資料分類控制元件,可以利用某一個欄位的資料的不同的值,讓資料流從一路到多路,

1. 選擇需要判斷的欄位
2. 選擇判斷欄位的值的型別
3. 填寫分類資料的判斷條件和目標步驟
本章節任務:將excel:13_Switch-Case.xlsx的資料按照部門欄位進行分類,將同一個部門的資料輸出到一個excel中

3.5.2 過濾記錄
和Switch/case做對比的話,過濾記錄相當于if-else,可以自定義輸入一個判斷條件,然后將資料流中的資料一路分為兩路,

- 在下面先填寫資料的判斷條件
- 然后再上面選擇下判斷條件為true或者false的輸出步驟
本章節任務:將excel:13_Switch-Case.xlsx的資料按照工資欄位進行判斷,將工資在20000及以上的資料輸出到一個excel中,將工資小于20000的輸出到另外一個excel中,

3.5.3 空操作
空操作,顧名思義就是什么也不做,此控制元件一般作為資料流的終點,

本章節任務:修改上節的轉換任務,將工資大于等于20000的資料輸出,小于20000的資料直接丟棄,熟悉空操作控制元件的使用,

3.5.3 中止
中止是資料流的終點,如果有資料流到此控制元件處,整個轉換程式將中止,并且在控制臺輸出報錯資訊,此控制元件一般用來校驗資料,或者除錯程式,

本章節任務:使用中止控制元件判斷上節任務中是否有人的工資低于20000,如果發現有人的工資低于20000的話,中止程式,并在控制臺輸出資訊,

3.6 Kettle查詢控制元件
查詢是轉換里面的第九個分類,查詢控制元件是用來查詢資料源里面的資料,并合并到主資料流中,
3.6.1 資料庫查詢
資料庫查詢就是從資料庫里面查詢出資料,然后跟資料流中的資料進行左連接的一個程序,左連接的意思是資料流中原本的資料全部有,但是資料庫查詢控制元件查詢出來的資料不一定全部會列出,只能按照輸入的匹配條件來進行關聯,

- 選擇合適的資料庫鏈接
- 輸入要去資料庫里面查詢的表名
- 輸入兩個表進行左連接的連接條件
- 獲取回傳欄位,得到查詢表回傳的值
本章節任務:利用表輸入控制元件獲取到staff表的資料,然后利用資料庫查詢控制元件查詢到department表的資料,然后對兩個表按照dept_id欄位進行左連接,并預覽資料

3.6.2 流查詢
流查詢控制元件就是查詢兩條資料流中的資料,然后按照指定的欄位做等值匹配,注意:流查詢在查詢前把資料都加載到記憶體中,并且只能進行等值查詢,

- 輸入查詢的資料流
- 輸入兩個流進行匹配的欄位(等值匹配)
- 輸入查詢出的欄位
本章節任務:用流查詢控制元件,將staff和department的資料按照dept_id欄位進行關聯起來

3.7 Kettle連接控制元件
連接是轉換里面的第十個分類,連接分類下的控制元件一般都是將多個資料集通過關鍵字進行連接起來,形成一個資料集的程序,
3.7.1 合并記錄
合并記錄是用于將兩個不同來源的資料合并,這兩個來源的資料分別為舊資料和新資料,該步驟將舊資料和新資料按照指定的關鍵字匹配、比較、合并,注意舊資料和新資料需要事先按照關鍵欄位排序,并且舊資料和新資料要有相同的欄位名稱,
合并后的資料將包括舊資料來源和新資料來源里的所有資料,對于變化的資料,使用新資料代替舊資料,同時在結果里用一個標示欄位,來指定新舊資料的比較結果,

- 舊資料源:選擇舊資料來源的步驟
- 新資料源:選擇新資料來源的步驟
- 標志欄位:設定標志欄位的名稱,標志欄位用于保存比較的結果,比較結果有下列幾種
① “identical” – 舊資料和新資料一樣
② “changed” – 資料發生了變化;
③ “new” – 新資料中有而舊資料中沒有的記錄
④ “deleted” –舊資料中有而新資料中沒有的記錄 - 關鍵欄位:用于定位判斷兩個資料源中的同一條記錄的欄位,
- 比較欄位:對于兩個資料源中的同一條記錄,指定需要比較的欄位
本章節任務:利用合并記錄控制元件比較合并記錄-新舊excel的資料,并預覽資料,查看標志欄位的內容


3.7.2 記錄集連接
記錄集連接可以對兩個步驟中的資料流進行左連接,右連接,內連接,外連接,此控制元件功能比較強大,企業做ETL開發會經常用到此控制元件,但是需要注意在進行記錄集連接之前,需要對記錄集的資料進行排序,并且排序的欄位還一定要選兩個表關聯的欄位,否則資料錯亂,出現null值,

- 選擇需要連接的兩個資料流的步驟
- 選擇連接型別,一共有四個:INNER,LEFT OUTER,RIGHT OUTER,FULL OUTER
- 從兩個資料流步驟里面選出連接欄位
本章節任務:使用記錄集連接控制元件對資料庫表satff和department按照部門id分別進行內連接,左連接,右連接,外連接,查看資料的不同
注意:兩個表進行排序記錄的時候,排序的欄位一定要選擇部門id,否則資料會不正確

3.8 Kettle統計控制元件
統計是轉換里面的第十三個分類,統計控制元件可以提供資料的采樣和統計功能,
3.8.1 分組
分組控制元件的功能類似于GROUP BY,可以按照指定的一個或者幾個欄位進行分組,然后其余欄位可以按照聚合函式進行合并計算,注意,在進行分組之前,資料最好先進行排序,

- 選擇分組欄位
- 給其余欄位選擇合適的聚合函式進行計算
本章節任務:給表staff的資料按照部門進行分組,求出各部門人數以及各部門員工的平均年齡,

3.9 Kettle映射控制元件
映射是轉換里面的第十八個分類,映射可以用來定義子轉換,方便代碼封裝和重用,
3.9.1 映射
映射(子轉換)是用來配置子轉換,對子轉換進行呼叫的一個步驟,

映射輸入規范是輸入欄位,由呼叫的轉換輸入,

映射輸出規范是向呼叫的轉換輸出所有列,不做任何處理,

本章節任務:封裝一個子轉換能夠通過dept_id求出dept_name,然后使用另外一個轉換呼叫此子轉換,求出數據庫staff表id=3的員工的姓名,年齡,部門id,部門姓名,并輸出到控制臺,




3.10 Kettle腳本控制元件
腳本是轉換的第七個分類,腳本就是直接通過寫程式代碼完成一些復雜的操作,
3.10.1 執行SQL腳本
執行sql腳本控制元件就是連接到資料庫里面,然后執行自己寫的一些sql陳述句

- 選擇合適的資料庫連接
- 填入要執行的sql陳述句
本章節任務:利用執行sql腳本控制元件將student表資料的atguigu的年齡更新為18,

第4章 Kettle作業
4.1 作業簡介
大多數ETL專案都需要完成各種各樣的維護作業,例如,如何傳送檔案;驗證資料庫表是否存在等等,而這些操作都是按照一定順序完成,因為轉換以并行方式執行,就需要一個可以串行執行的作業來處理這些操作,
一個作業包含一個或者多個作業項,這些作業項以某種順序來執行,作業執行順序由作業項之間的跳(job hop)和每個作業項的執行結果來決定,
4.1.1 作業項
作業項是作業的基本構成部分,如同轉換的步驟,作業項也可以使用圖示的方式圖形化展示,但是,作業項和轉換步驟有下面幾點不同:
- 轉換步驟與步驟之間是資料流,作業項之間是步驟流,
- 轉換啟動以后,所有步驟一起并行啟動等待資料行的輸入,而作業項是嚴格按照執行順序啟動,一個作業項執行完以后,再執行下一個作業項,
- 在作業項之間可以傳遞一個結果物件(result object),這個結果物件里面包含了資料行,它們不是以資料流的方式來傳遞的,而是等待一個作業項執行完了,再傳遞個下一個作業項,
- 因為作業順序執行作業項,所以必須定義一個起點,有一個叫“開始”的作業項就定義了這個點,一個作業只能定一個開始作業項,
4.1.2 作業跳
作業的跳是作業項之間的連接線,他定義了作業的執行路徑,作業里每個作業項的不同運行結果決定了做作業的不同執行路徑,作業跳一共分為下面三種情況:
①無條件執行:不論上一個作業項執行成功還是失敗,下一個作業項都會執行,這是一種藍色的連接線,上面有一個鎖的圖示,

②當運行結果為真時執行:當上一個作業項的執行結果為真時,執行下一個作業項,通常在需要無錯誤執行的情況下使用,這是一種綠色的連接線,上面有一個對鉤號的圖示,

③當運行結果為假時執行:當上一個作業項的執行結果為假或者沒有成功執行是,執行下一個作業項,這是一種紅色的連接線,上面有一個紅色的停止圖示,

在圖示上單擊就可以對跳進行設定,
4.2 作業初體驗
作業案例:將3.10.1章節的轉換嵌入作業中執行,執行成功或者失敗都發送郵件提醒
1) 點擊左上角的檔案,新建一個作業

2) 按照下圖設定作業項和作業跳

3) 轉換作業項設定,選擇要嵌入的轉換檔案

4) 發送郵件作業項設定,




5) 分別嘗試作業執行成功和失敗,查看kettle發送的郵件資訊
第5章 Kettle使用案例
5.1 轉換案例
案例一:把stu1的資料按id同步到stu2,stu2有相同id則更新資料
(1)在mysql中創建兩張表
mysql> create database kettle;
mysql> use kettle;
mysql> create table stu1(id int,name varchar(20),age int);
mysql> create table stu2(id int,name varchar(20));
(2)往兩張表中插入一些資料
mysql> insert into stu1 values(1001,'zhangsan',20),(1002,'lisi',18), (1003,'wangwu',23);
mysql> insert into stu2 values(1001,'wukong');
(3)在kettle中新建轉換

(4)分別在輸入和輸出中拉出表輸入和插入/更新

(5)雙擊表輸入物件,填寫相關配置,測驗是否成功

(6)雙擊 更新/插入物件,填寫相關配置

(7)保存轉換,啟動運行,去mysql表查看結果
注意:如果需要連接mysql資料庫,需要先將mysql的連接驅動包復制到kettle的根目錄下的lib目錄中,否則會報錯找不到驅動,

5.2 作業案例
案例二:使用作業執行上述轉換,并且額外在表stu2中添加一條資料,整個作業運行成功的話發郵件提醒
(1)新建一個作業

(2) 按圖示拉取組件

(3)雙擊Start編輯Start

(4)雙擊轉換,選擇案例1保存的檔案

(5)雙擊SQL,編輯SQL陳述句

(6)雙擊發送郵件,編輯發送郵件的設定資訊



(7)保存作業并執行,然后去mysql查看結果和郵件資訊
5.3 Hive-HDFS案例
案例三:將hive表的資料輸出到hdfs
(1)因為涉及到hive和hbase的讀寫,需要先修改相關組態檔,
修改kettle安裝目錄下的data-integration\plugins\pentaho-big-data-plugin下的plugin.properties,設定active.hadoop.configuration=hdp26,并將如下組態檔拷貝到data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp26下
(2)啟動hdfs,yarn,zookeeper,hbase集群的所有行程,啟動hiveserver2服務
[atguigu@hadoop102 ~]$ hadoop.sh start //自己寫的hadoop啟動腳本
[atguigu@hadoop102 ~]$ zk.sh start //自己寫的zookeeper啟動腳本
[atguigu@hadoop102 ~]$ /opt/module/hbase-1.3.1/bin/start-hbase.sh
[atguigu@hadoop102 ~]$ /opt/module/hive/bin/hiveserver2
(3)進入beeline,查看10000埠開啟情況
[atguigu@hadoop102 ~]$ /opt/module/hive/bin/beeline
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop102:10000(回車)
Connecting to jdbc:hive2://hadoop102:10000
Enter username for jdbc:hive2://hadoop102:10000: atguigu(輸入atguigu)
Enter password for jdbc:hive2://hadoop102:10000:(直接回車)
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop102:10000>(到了這里說明成功開啟10000埠)
(4)創建兩張表dept和emp
CREATE TABLE dept(deptno int, dname string,loc string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm int,
deptno int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
(5)插入資料
insert into dept values(10,'accounting','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');
insert into emp values
(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20),
(7499,'ALLEN','SALESMAN',7698,'1980-12-17',1600,300,30),
(7521,'WARD','SALESMAN',7698,'1980-12-17',1250,500,30),
(7566,'JONES','MANAGER',7839,'1980-12-17',2975,NULL,20);
(6)按下圖建立流程圖
(7)設定表輸入,連接hive
(8)設定排序屬性
(9)設定連接屬性
(10)設定欄位選擇
(11)設定檔案輸出,點擊瀏覽按鈕
選擇存盤路徑為HDFS,并且新建一個Hadoop Cluster連接
按照集群配置輸入對應的引數
選擇創建好的大資料集群連接
然后再依次設定文本檔案輸出控制元件的檔案,內容,欄位三個設定頁,注意一定要獲取欄位
(12)保存并運行轉換,然后查看hdfs
5.4 HDFS-Hbase案例
案例四:讀取hdfs檔案并將sal大于1000的資料保存到hbase中
(1) 在HBase中創建一張表用于存放資料
[atguigu@hadoop102 ~]$ /opt/module/hbase-1.3.1/bin/hbase shell
hbase(main):004:0> create 'people','info'
(2)按下圖建立流程圖
(3)設定檔案輸入,連接hdfs
注意千萬別忘記獲取欄位,然后給欄位設定格式
(4)設定過濾記錄
(5)設定HBase output控制元件
1.選擇一個大資料集群連接
2.選擇上面復制過來的hbase-site.xml
3.去第二個配置頁面創建映射,然后保存映射(選擇rowkey欄位)
4.再回第一個配置頁選擇Hbase表以及剛剛創建好的映射
注意:若報錯沒有權限往hdfs寫檔案,在Spoon.bat中第119行添加引數
"-DHADOOP_USER_NAME=atguigu" "-Dfile.encoding=UTF-8"
(6)保存轉換并運行,然戶去hbase里面查看資料
第6章 Kettle資源庫
6.1 資料庫資源庫
資料庫資源庫是將作業和轉換相關的資訊存盤在資料庫中,執行的時候直接去資料庫讀取資訊,很容易跨平臺使用
1)點擊右上角connect,選擇Other Resporitory
-
選擇Database Repository
-
建立新連接
-
填好之后,點擊finish,會在指定的庫中創建很多表,至此資料庫資源庫創建完成
-
連接資源庫,默認賬號密碼為admin
-
將之前做過的轉換匯入資源庫
(1)選擇從xml檔案匯入
(2)隨便選擇一個轉換
(3)點擊保存,選擇存盤位置及檔案名
(4)打開資源庫查看保存結果
6.2 檔案資源庫
將作業和轉換相關的資訊存盤在指定的目錄中,其實和XML的方式一樣,創建方式跟創建資料庫資源庫步驟類似,只是不需要用戶密碼就可以訪問,跨平臺使用比較麻煩
1)選擇connect
2)點擊add后點擊Other Repositories
3)選擇File Repository
4)填寫資訊
第7章 Kettle調優
1、調整JVM大小進行性能優化,修改Kettle根目錄下的Spoon腳本,
引數參考:
-Xmx2048m:設定JVM最大可用記憶體為2048M,
-Xms1024m:設定JVM促使記憶體為1024m,此值可以設定與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配記憶體,
-Xmn2g:設定年輕代大小為2G,整個JVM記憶體大小=年輕代大小 + 年老代大小 + 持久代大小,持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小,此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8,
-Xss128k:設定每個執行緒的堆疊大小,JDK5.0以后每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K,更具應用的執行緒所需記憶體大小進行調整,在相同物理記憶體下,減小這個值能生成更多的執行緒,但是作業系統對一個行程內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右,
2、 調整提交(Commit)記錄數大小進行優化,Kettle默認Commit數量為:1000,可以根據資料量大小來設定Commitsize:1000~50000
3、盡量使用資料庫連接池;
4、盡量提高批處理的commit size;
5、盡量使用快取,快取盡量大一些(主要是文本檔案和資料流);
6、Kettle是Java做的,盡量用大一點的記憶體引數啟動Kettle;
7、可以使用sql來做的一些操作盡量用sql;
Group , merge , stream lookup,split field這些操作都是比較慢的,想辦法避免他們.,能用sql就用sql;
8、插入大量資料的時候盡量把索引刪掉;
9、盡量避免使用update , delete操作,尤其是update,如果可以把update變成先delete, 后insert;
10、能使用truncate table的時候,就不要使用deleteall row這種類似sql合理的磁區,如果洗掉操作是基于某一個磁區的,就不要使用delete row這種方式(不管是deletesql還是delete步驟),直接把磁區drop掉,再重新創建;
11、盡量縮小輸入的資料集的大小(增量更新也是為了這個目的);
12、盡量使用資料庫原生的方式裝載文本檔案(Oracle的sqlloader, mysql的bulk loader步驟),
本文來自博客園,作者:JD_L,轉載請注明原文鏈接:https://www.cnblogs.com/dream-come-true/p/17447085.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554011.html
標籤:大數據
上一篇:Apache DolphinScheduler 3.0.6 發布,或將是最后一個 3.0.X 版本
下一篇:返回列表
