【ETL工具】-Kettle详细教程
一 Kettle概述
1.1 ETL簡介
ETL(Extract-Transform-Load的縮寫,即數(shù)據(jù)抽取、轉(zhuǎn)換、裝載的過程),對于企業(yè)或行業(yè)應(yīng)用來說,經(jīng)常會(huì)遇到各種數(shù)據(jù)的處理,轉(zhuǎn)換,遷移,所以了解并掌握一種ETL工具的使用,必不可少。
市面上常用的ETL工具有很多,比如Sqoop,DataX,Kettle等。
1.2 Kettle簡介
1.2.1 Kettle是什么
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運(yùn)行,綠色無需安裝,數(shù)據(jù)抽取高效穩(wěn)定。
Kettle 中文名稱叫水壺,該項(xiàng)目的主程序員MATT 希望把各種數(shù)據(jù)放到一個(gè)壺里,然后以一種指定的格式流出。
Kettle這個(gè)ETL工具集,它允許你管理來自不同數(shù)據(jù)庫的數(shù)據(jù),通過提供一個(gè)圖形化的用戶環(huán)境來描述你想做什么,而不是你想怎么做。
Kettle中有兩種腳本文件,transformation和job,transformation完成針對數(shù)據(jù)的基礎(chǔ)轉(zhuǎn)換,job則完成整個(gè)工作流的控制。
Kettle(現(xiàn)在已經(jīng)更名為PDI,Pentaho Data Integration-Pentaho數(shù)據(jù)集成)。
1.2.2 Kettle的兩種設(shè)計(jì)
1.2.3 Kettle的核心組件
1.2.4 Kettle特點(diǎn)
二 Kettle安裝部署
2.1 Kettle下載
2.1.1 下載地址
官網(wǎng)地址
https://community.hitachivantara.com/docs/DOC-1009855
下載地址
https://sourceforge.net/projects/pentaho/files/Data%20Integration/
2.1.2 Kettle目錄說明
2.1.3 Kettle文件說明
2.2 Kettle安裝部署
2.2.1 概述
在實(shí)際企業(yè)開發(fā)中,都是在本地Windows環(huán)境下進(jìn)行kettle的job和Transformation開發(fā)的,可以在本地運(yùn)行,也可以連接遠(yuǎn)程機(jī)器運(yùn)行
2.2.2 安裝
1) 安裝jdk,版本建議1.8及以上
2) 下載kettle壓縮包,因kettle為綠色軟件,解壓縮到任意本地路徑即可
3) 雙擊Spoon.bat,啟動(dòng)圖形化界面工具,就可以直接使用了
2.3 Kettle界面簡介
2.3.1 首頁
2.3.2 轉(zhuǎn)換
2.3.3 作業(yè)
2.4 Kettle轉(zhuǎn)換初次體驗(yàn)
體驗(yàn)案例:將csv文件用Kettle轉(zhuǎn)換成excel文件
3)按住鍵盤SHIFT鍵,并且點(diǎn)擊鼠標(biāo)左鍵將兩個(gè)控件鏈接起來,鏈接時(shí)選擇“主輸出步驟”
4)雙擊Excel輸出控件,在彈出的設(shè)置框里設(shè)置文件輸出路徑和文件名稱,然后點(diǎn)擊上面的字段框,依次點(diǎn)擊下面的獲取字段和最小寬度,獲取到輸出字段。
5)點(diǎn)擊左上角的啟動(dòng)按鈕,在彈出的設(shè)置框里點(diǎn)擊啟動(dòng),執(zhí)行該轉(zhuǎn)換。
6)查看kettle下方執(zhí)行結(jié)果日志以及輸出路徑的Excel文件內(nèi)容
2.5 Kettle核心概念
2.5.1 可視化編程
Kettle可以被歸類為可視化編程語言(Visula Programming Languages,VPL),因?yàn)镵ettle可以使用圖形化的方式定義復(fù)雜的ETL程序和工作流。
可視化編程一直是Kettle里的核心概念,它可以讓你快速構(gòu)建復(fù)雜的ETL作業(yè)和減低維護(hù)工作量。它通過隱藏很多技術(shù)細(xì)節(jié),使IT領(lǐng)域更貼近于商務(wù)領(lǐng)域。
Kettle里的代碼就是轉(zhuǎn)換和作業(yè)。
2.5.2 轉(zhuǎn)換
轉(zhuǎn)換(transaformation)負(fù)責(zé)數(shù)據(jù)的輸入、轉(zhuǎn)換、校驗(yàn)和輸出等工作。Kettle 中使用轉(zhuǎn)換完成數(shù)據(jù) ETL 全部工作。轉(zhuǎn)換由多個(gè)步驟 (Step) 組成,如文本文件輸入,過濾輸出行,執(zhí)行 SQL 腳本等。各個(gè)步驟使用跳 (Hop) 來鏈接。 跳定義了一個(gè)數(shù)據(jù)流通道,即數(shù)據(jù)由一個(gè)步驟流 (跳) 向下一個(gè)步驟。在 Kettle 中數(shù)據(jù)的最小單位是數(shù)據(jù)行(row),數(shù)據(jù)流中流動(dòng)其實(shí)是緩存的行集 (RowSet) 。
2.5.3 步驟(Step)
步驟(控件)是轉(zhuǎn)換里的基本的組成部分,剛才的案例中就存在兩個(gè)步驟,“CSV文件輸入”和“Excel輸出”。
一個(gè)步驟有如下幾個(gè)關(guān)鍵特性:
①步驟需要有一個(gè)名字,這個(gè)名字在同一個(gè)轉(zhuǎn)換范圍內(nèi)唯一。
②每個(gè)步驟都會(huì)讀、寫數(shù)據(jù)行(唯一例外是“生成記錄”步驟,該步驟只寫數(shù)據(jù))。
③步驟將數(shù)據(jù)寫到與之相連的一個(gè)或多個(gè)輸出跳(hop),再傳送到跳的另一端的步驟。
④大多數(shù)的步驟都可以有多個(gè)輸出跳。一個(gè)步驟的數(shù)據(jù)發(fā)送可以被設(shè)置為分發(fā)和復(fù)制,分發(fā)是目標(biāo)步驟輪流接收記錄,復(fù)制是所有的記錄被同時(shí)發(fā)送到所有的目標(biāo)步驟。
2.5.4 跳(Hop)
跳就是步驟之間帶箭頭的連線,跳定義了步驟之間的數(shù)據(jù)通路。
跳實(shí)際上是兩個(gè)步驟之間的被稱之為行集的數(shù)據(jù)行緩存,行集的大小可以在轉(zhuǎn)換的設(shè)置里定義。當(dāng)行集滿了,向行集寫數(shù)據(jù)的步驟將停止寫入,直到行集里又有了空間。當(dāng)行集空了,從行集讀取數(shù)據(jù)的步驟停止讀取,直到行集里又有可讀的數(shù)據(jù)行。
2.5.5 元數(shù)據(jù)
每個(gè)步驟在輸出數(shù)據(jù)行時(shí)都有對字段的描述,這種描述就是數(shù)據(jù)行的元數(shù)據(jù)。
通常包含下面一些信息。
①名稱:數(shù)據(jù)行里的字段名是唯一的。
②數(shù)據(jù)類型:字段的數(shù)據(jù)類型。
③格式:數(shù)據(jù)顯示的方式,如Integer的#、0.00。
④長度:字符串的長度或者BigNumber類型的長度。
⑤精度:BigNumber數(shù)據(jù)類型的十進(jìn)制精度。
⑥貨幣符號(hào):¥
⑦小數(shù)點(diǎn)符號(hào):十進(jìn)制數(shù)據(jù)的小數(shù)點(diǎn)格式。不同文化背景下小數(shù)點(diǎn)符號(hào)是不同的,一般是點(diǎn)(.)或逗號(hào)(,)。
⑧分組符號(hào):數(shù)值類型數(shù)據(jù)的分組符號(hào),不同文化背景下數(shù)字里的分組符號(hào)也是不同的,一般是點(diǎn)(.)或逗號(hào)(,)或單引號(hào)(’)
2.5.6 數(shù)據(jù)類型
數(shù)據(jù)以數(shù)據(jù)行的形式沿著步驟移動(dòng)。一個(gè)數(shù)據(jù)行是零到多個(gè)字段的集合,字段包含下面幾種數(shù)據(jù)類型。
①String:字符類型數(shù)據(jù)
②Number:雙精度浮點(diǎn)數(shù)。
③Integer:帶符號(hào)長整型(64位)。
④BigNumber:任意精度數(shù)據(jù)。
⑤Date:帶毫秒精度的日期時(shí)間值。
⑥Boolean:取值為true和false的布爾值。
⑦Binary:二進(jìn)制字段可以包含圖像、聲音、視頻及其他類型的二進(jìn)制數(shù)據(jù)。
2.5.7 并行
跳的這種基于行集緩存的規(guī)則允許每個(gè)步驟都是由一個(gè)獨(dú)立的線程運(yùn)行,這樣并發(fā)程度最高。這一規(guī)則也允許數(shù)據(jù)以最小消耗內(nèi)存的數(shù)據(jù)流的方式來處理。在數(shù)據(jù)倉庫里,我們經(jīng)常要處理大量數(shù)據(jù),所以這種高并發(fā)低消耗的方式也是ETL工具的核心需求。
對于kettle的轉(zhuǎn)換,不能定義一個(gè)執(zhí)行順序,因?yàn)樗胁襟E都以并發(fā)方式執(zhí)行:當(dāng)轉(zhuǎn)換啟動(dòng)后,所有步驟都同時(shí)啟動(dòng),從它們的輸入跳中讀取數(shù)據(jù),并把處理過的數(shù)據(jù)寫到輸出跳,直到輸入跳里不再有數(shù)據(jù),就中止步驟的運(yùn)行。當(dāng)所有的步驟都中止了,整個(gè)轉(zhuǎn)換就中止了。
如果你想要一個(gè)任務(wù)沿著指定的順序執(zhí)行,那么就要使用下面的“作業(yè)”!
2.5.8 作業(yè)
作業(yè)?(Job),負(fù)責(zé)定義一個(gè)完成整個(gè)工作流的控制,比如將轉(zhuǎn)換的結(jié)果發(fā)送郵件給相關(guān)人員。因?yàn)檗D(zhuǎn)換(transformation)以并行方式執(zhí)行,所以必須存在一個(gè)串行的調(diào)度工具來執(zhí)行轉(zhuǎn)換,這就是 Kettle中的作業(yè)。
三 Kettle轉(zhuǎn)換
3.1 Kettle輸入控件
輸入是轉(zhuǎn)換里面的第一個(gè)分類,輸入控件也是轉(zhuǎn)換中的第一大控件,用來抽取數(shù)據(jù)或者生成數(shù)據(jù)。輸入是ETL里面的E(Extract),主要做數(shù)據(jù)提取的工作。
由于Kettle中自帶的輸入控件比較多,本次只挑出開發(fā)中經(jīng)常使用的幾個(gè)輸入控件來進(jìn)行講解。
3.1.1 CSV文件輸入
CSV文件是一個(gè)用逗號(hào)分隔的固定格式的文本文件,這種文件后綴名為.csv,可以用Excel或者文本編輯器打開。在企業(yè)里面一般最常見的ETL需求就是將csv文件轉(zhuǎn)換為excel文件,如果用Kettle來做這個(gè)ETL工作,就需要用到CSV文件輸入控件。
任務(wù):將CSV文件轉(zhuǎn)換成Excel文件。
3.1.2 文本文件輸入
提取服務(wù)器上的日志信息是公司里ETL開發(fā)很常見的操作,日志信息基本上都是文本類型,因此文本文件輸入控件是kettle中常用的一個(gè)輸入控件。使用文本文件輸入控件步驟:
任務(wù):將txt日志文件轉(zhuǎn)換為Excel文件
3.1.3 Excel輸入
Excel輸入控件也是很常用的輸入控件,一般企業(yè)里會(huì)用此控件對大量的Excel文件進(jìn)行ETL操作。使用Excel輸入控件步驟如下:
本章節(jié)任務(wù):將excel文件的兩個(gè)sheet表格的數(shù)據(jù)重新寫到一個(gè)新的excel文件中
3.1.4 表輸入
1)創(chuàng)建數(shù)據(jù)庫連接
表輸入可以說是kettle中用到最多的一種輸入控件,因?yàn)槠髽I(yè)中大部分的數(shù)據(jù)都會(huì)存在數(shù)據(jù)庫中。kettle可以連接市面上常見的各種數(shù)據(jù)庫,比如Oracle,Mysql,SqlServer,DB2等。但是在連接各個(gè)數(shù)據(jù)庫之前,我們需要先配置好對應(yīng)的數(shù)據(jù)庫驅(qū)動(dòng),本次以mysql為例,給大家演示kettle連接mysql數(shù)據(jù)庫的過程。
首先我們要將對應(yīng)版本的mysql連接驅(qū)動(dòng)放到kettle安裝目錄下面的lib文件夾下,然后重啟kettle的客戶端Spoon
重啟Spoon客戶端以后,我們就可以創(chuàng)建對應(yīng)的數(shù)據(jù)庫連接了,在轉(zhuǎn)換視圖的主對象樹目錄下,有個(gè)DB連接,右鍵然后選擇新建,在打開數(shù)據(jù)庫連接框里,填寫正確的數(shù)據(jù)庫信息,然后測試,測試無誤后,可以保存此數(shù)據(jù)庫連接。
數(shù)據(jù)庫連接默認(rèn)只對本轉(zhuǎn)換有效,換一個(gè)轉(zhuǎn)換以后,這個(gè)連接就沒法用了,還需要新建數(shù)據(jù)庫連接,所以我們需要將建好的這個(gè)數(shù)據(jù)庫連接進(jìn)行共享下,共享以后,其他的轉(zhuǎn)換也能用我們提前建好的這個(gè)數(shù)據(jù)庫連接了。
2)表輸入
創(chuàng)建好數(shù)據(jù)庫連接以后,我們就可以使用表輸入控件了,雙擊表輸入控件,選擇剛剛創(chuàng)建的數(shù)據(jù)庫連接,然后在SQL框里輸入合適的查詢語句,然后點(diǎn)擊預(yù)覽按鈕,看能否預(yù)覽到我們期望的數(shù)據(jù)。
任務(wù):創(chuàng)建數(shù)據(jù)庫連接,然后使用表輸入控件將student表的數(shù)據(jù)寫到excel中。
3.2 Kettle輸出控件
輸出是轉(zhuǎn)換里面的第二個(gè)分類,輸出控件也是轉(zhuǎn)換中的第二大控件,用來存儲(chǔ)數(shù)據(jù)。輸出是ETL里面的L(Load),主要做數(shù)據(jù)加載的工作。
由于Kettle中自帶的輸出控件比較多,本次只挑出開發(fā)中經(jīng)常使用的幾個(gè)輸出控件來進(jìn)行講解,詳情如下圖。
3.2.1 Excel輸出
Kettle中自帶了兩個(gè)Excel輸出,一個(gè)Excel輸出,另一個(gè)是Microsoft Excel輸出。
Excel輸出只能輸出xls文件(適合Excel2003),Microsoft Excel輸出可以輸出xls和xlsx文件(適合Excel2007及以后)
Excel輸出大家已經(jīng)很熟悉了,不再贅述了,接下來給大家講下Microsoft Excel輸出。
任務(wù):使用表輸入控件,將student表的數(shù)據(jù),以復(fù)制的方式輸出到xls和xlsx文件中
3.2.2 文本文件輸出
文本文件輸出控件,顧名思義,這是一個(gè)能將數(shù)據(jù)輸出成文本的控件,比較簡單,在企業(yè)里面也比較常用。
任務(wù):將student表的數(shù)據(jù)復(fù)制兩份,導(dǎo)出成txt和csv文件
3.2.3 SQL文件輸出
SQL文件輸出一般跟表輸入做連接,然后將數(shù)據(jù)庫表的表結(jié)構(gòu)和數(shù)據(jù)以sql文件的形式導(dǎo)出,然后做數(shù)據(jù)庫備份的這么一個(gè)工作。
任務(wù):將student表的表結(jié)構(gòu)和數(shù)據(jù)利用kettle導(dǎo)出成sql文件備份
3.2.4 表輸出
表輸出控件可以將kettle數(shù)據(jù)行中的數(shù)據(jù)直接寫入到數(shù)據(jù)庫中的表中,企業(yè)里做ETL工作會(huì)經(jīng)常用到此控件。
任務(wù):將student表的數(shù)據(jù)導(dǎo)入到student2表中,要求利用kettle現(xiàn)場創(chuàng)建student2表
3.2.5 更新&插入/更新(缺點(diǎn):掃全表)
更新和插入/更新,這兩個(gè)控件是kettle提供的將數(shù)據(jù)庫已經(jīng)存在的記錄與數(shù)據(jù)流里面的記錄進(jìn)行對比的控件。企業(yè)級(jí)ETL經(jīng)常會(huì)用到這兩個(gè)控件來進(jìn)行數(shù)據(jù)庫更新的操作
兩者區(qū)別:
更新是將數(shù)據(jù)庫表中的數(shù)據(jù)和數(shù)據(jù)流中的數(shù)據(jù)做對比,如果不同就更新,如果數(shù)據(jù)流中的數(shù)據(jù)比數(shù)據(jù)庫表中的數(shù)據(jù)多,那么就報(bào)錯(cuò)。
插入/更新的功能和更新一樣,只不過優(yōu)化了數(shù)據(jù)不存在就插入的功能,因此企業(yè)里更多的也是使用插入/更新。
任務(wù):手動(dòng)修改下student表的數(shù)據(jù)(修改和新增),然后用修改后的數(shù)據(jù)和student2來進(jìn)行對比,分別嘗試更新和插入/更新控件的區(qū)別
3.2.6 刪除
刪除控件可以刪除數(shù)據(jù)庫表中指定條件的數(shù)據(jù),企業(yè)里一般用此控件做數(shù)據(jù)庫表數(shù)據(jù)刪除或者跟另外一個(gè)表數(shù)據(jù)做對比,然后進(jìn)行去重的操作。
任務(wù):刪除student2表格中student表里面已有的數(shù)據(jù)(按照student表對student2表數(shù)據(jù)進(jìn)行去重)
3.3 Kettle轉(zhuǎn)換控件
轉(zhuǎn)換控件是轉(zhuǎn)換里面的第四個(gè)分類,轉(zhuǎn)換控件也是轉(zhuǎn)換中的第三大控件,用來轉(zhuǎn)換數(shù)據(jù)。轉(zhuǎn)換是ETL里面的T(Transform),主要做數(shù)據(jù)轉(zhuǎn)換,數(shù)據(jù)清洗的工作。ETL整個(gè)過程中,Transform的工作量最大,耗費(fèi)的時(shí)間也比較久,大概可以占到整個(gè)ETL的三分之二。
由于Kettle中自帶的轉(zhuǎn)換控件比較多,本次只挑出開發(fā)中經(jīng)常使用的幾個(gè)轉(zhuǎn)換控件來進(jìn)行講解,詳情如下圖。
3.3.1 Concat fields
轉(zhuǎn)換控件Concat fields,顧名思義,就是將多個(gè)字段連接起來形成一個(gè)新的字段。
任務(wù):將staff表的firstname和lastname拼接起來,形成name字段,然后再將數(shù)據(jù)插入到新表emp中
提示:如果涉及到中文亂碼問題,請參考資料:Mysql中文亂碼問題.docx
3.3.2 值映射
值映射就是把字段的一個(gè)值映射成其他的值。在數(shù)據(jù)質(zhì)量規(guī)范上使用非常多,比如很多系統(tǒng)對應(yīng)性別sex字段的定義不同。所以我們需要利用此控件,將同一個(gè)字段的不同的值,映射轉(zhuǎn)換成我們需要的值。
任務(wù):將staff表的sex字段,映射成男or女,然后再插入到emp表中
3.3.3 增加常量&增加序列
增加常量就是在本身的數(shù)據(jù)流里面添加一列數(shù)據(jù),該列的數(shù)據(jù)都是相同的值。
增加序列是給數(shù)據(jù)流添加一個(gè)序列字段,可以自定義該序列字段的遞增步長。
任務(wù):給表staff的數(shù)據(jù)加一列固定值slary和一個(gè)遞增的number序列,在控制臺(tái)預(yù)覽下數(shù)據(jù)即可,不用輸出。
3.3.4 字段選擇
字段選擇是從數(shù)據(jù)流中選擇字段、改變名稱、修改數(shù)據(jù)類型。
任務(wù):在上一個(gè)轉(zhuǎn)換之后,添加字段選擇控件,移除掉firstname字段,并且將lastname重命名為name,將slary重命名為money,然后再次預(yù)覽數(shù)據(jù),查看數(shù)據(jù)的變化
3.3.5 計(jì)算器
計(jì)算器是一個(gè)函數(shù)集合來創(chuàng)建新的字段,還可以設(shè)置字段是否移除(臨時(shí)字段)。我們可以通過計(jì)算器里面的多個(gè)計(jì)算函數(shù)對已有字段進(jìn)行計(jì)算,得出新字段。
任務(wù):在上一任務(wù)基礎(chǔ)之上,添加計(jì)算器控件對money和number字段進(jìn)行相乘,得出新字段acount,然后預(yù)覽數(shù)據(jù)。
3.3.6 字符串剪切&替換&操作
轉(zhuǎn)換控件中有三個(gè)關(guān)于字符串的控件,分別是剪切字符串,字符串操作,字符串替換
剪切字符串是指定輸入流字段裁剪的位置剪切出新的字段。
字符串替換是指定搜索內(nèi)容和替換內(nèi)容,如果輸入流的字段匹配上搜索內(nèi)容就進(jìn)行替換生成新字段。
字符串操作是去除字符串兩端的空格和大小寫切換,并生成新的字段。
任務(wù):在上一個(gè)任務(wù)之后,添加剪切字符串,字符串替換,字符串操作三個(gè)控件,利用這三個(gè)控件分別對sex字段進(jìn)行剪切,替換,操作(去空格,轉(zhuǎn)大小寫)
3.3.7 排序記錄&去除重復(fù)記錄
去除重復(fù)記錄是去除數(shù)據(jù)流里面相同的數(shù)據(jù)行。但是此控件使用之前要求必須先對數(shù)據(jù)進(jìn)行排序,對數(shù)據(jù)排序用的控件是排序記錄,排序記錄控件可以按照指定字段的升序或者降序?qū)?shù)據(jù)流進(jìn)行排序。因此排序記錄+去除重復(fù)記錄控件常常配合組隊(duì)使用。
任務(wù):利用excel輸入控件讀取input目錄下的06_去除重復(fù)記錄.xlsx,然后對里面重復(fù)的數(shù)據(jù)進(jìn)行按照id排序并去重
3.3.8 唯一行(哈希值)
唯一行(哈希值)就是刪除數(shù)據(jù)流重復(fù)的行。此控件的效果和(排序記錄+去除重復(fù)記錄)的效果是一樣的,但是實(shí)現(xiàn)的原理不同。排序記錄+去除重復(fù)記錄對比的是每兩行之間的數(shù)據(jù),而唯一行(哈希值)是給每一行的數(shù)據(jù)建立哈希值,通過哈希值來比較數(shù)據(jù)是否重復(fù),因此唯一行(哈希值)去重效率比較高,也更建議大家使用。
任務(wù):利用唯一行(哈希值)控件對06_去除重復(fù)記錄.xlsx去重,并且查看最后輸出的數(shù)據(jù)跟上個(gè)任務(wù)有何區(qū)別
3.3.9 拆分字段
拆分字段是把字段按照分隔符拆分成兩個(gè)或多個(gè)字段。需要注意的是,字段拆分以后,原字段就會(huì)從數(shù)據(jù)流中消失。
任務(wù):將07_拆分字段.xlsx里面的NBA球星的姓名,拆分成姓跟名。
3.3.10 列拆分為多行(炸列)
列拆分為多行就是把指定字段按指定分隔符進(jìn)行拆分為多行,然后其他字段直接復(fù)制。具體效果如下圖:
任務(wù):對08_列拆分為多行.xlsx的數(shù)據(jù)按照hobby字段進(jìn)行拆分為多行,然后將新數(shù)據(jù)輸出到excel文件中,查看數(shù)據(jù)。
3.3.11 行扁平化
行扁平化就是把同一組的多行數(shù)據(jù)合并成為一行,可以理解為列拆分為多行的逆向操作。但是需要注意的是行扁平化控件使用有兩個(gè)條件:
任務(wù):將09_行扁平化.xlsx的數(shù)據(jù)按照hobby字段進(jìn)行扁平化
3.3.12 列轉(zhuǎn)行
列轉(zhuǎn)行,顧名思義多列轉(zhuǎn)一行,就是如果數(shù)據(jù)一列有相同的值,按照指定的字段,將其中一列的字段內(nèi)容變成不同的列,然后把多行數(shù)據(jù)轉(zhuǎn)換為一行數(shù)據(jù)的過程。具體效果如下圖:
注意:列轉(zhuǎn)行之前數(shù)據(jù)流必須按照分組字段進(jìn)行排序,否則數(shù)據(jù)會(huì)錯(cuò)亂!
任務(wù):將input目錄下的10_列轉(zhuǎn)行.xlsx的數(shù)據(jù)進(jìn)行列轉(zhuǎn)行,熟悉列轉(zhuǎn)行控件的使用
3.3.13 行轉(zhuǎn)列
行轉(zhuǎn)列,一行轉(zhuǎn)多列,就是把數(shù)據(jù)字段的字段名轉(zhuǎn)換為一列,把數(shù)據(jù)行變?yōu)閿?shù)據(jù)列。我們也可以簡單理解為行轉(zhuǎn)列控件是列轉(zhuǎn)行控件的逆向操作。具體如下圖:
任務(wù):將input目錄下的11_行轉(zhuǎn)列.xlsx用excel控件輸入,然后行轉(zhuǎn)列,熟悉行轉(zhuǎn)列控件的使用。
3.4 Kettle應(yīng)用控件
應(yīng)用是轉(zhuǎn)換控件里面的第五個(gè)分類,這個(gè)分類下是Kettle給我們自帶的一些工具類
3.4.1 替換NULL值
替換NULL值,顧名思義就是將數(shù)據(jù)里面的null值替換成其他的值,此控件比較簡單,但是在企業(yè)里面也會(huì)經(jīng)常用到。
任務(wù):替換excel數(shù)據(jù)12_替換NULL值.xlsx的bonus列的null值為0
3.4.2 寫日志
寫日志控件主要是調(diào)試的時(shí)候使用,此控件可以將數(shù)據(jù)流的每行數(shù)據(jù)打印到控制臺(tái),方便我們調(diào)試整個(gè)程序。
任務(wù):在上個(gè)任務(wù)的基礎(chǔ)之上,添加寫日志控件,在控制臺(tái)輸出查看數(shù)據(jù)。
3.5 Kettle流程控件
流程是轉(zhuǎn)換里面的第六個(gè)分類,流程分類下的控件主要用來控制數(shù)據(jù)流程和數(shù)據(jù)流向。
3.5.1 Switch/case
Switch/case控件,最典型的數(shù)據(jù)分類控件,可以利用某一個(gè)字段的數(shù)據(jù)的不同的值,讓數(shù)據(jù)流從一路到多路。
任務(wù):將excel:13_Switch-Case.xlsx的數(shù)據(jù)按照部門字段進(jìn)行分類,將同一個(gè)部門的數(shù)據(jù)輸出到一個(gè)excel中
3.5.2 過濾記錄
和Switch/case做對比的話,過濾記錄相當(dāng)于if-else,可以自定義輸入一個(gè)判斷條件,然后將數(shù)據(jù)流中的數(shù)據(jù)一路分為兩路。
任務(wù):將excel:13_Switch-Case.xlsx的數(shù)據(jù)按照工資字段進(jìn)行判斷,將工資在20000及以上的數(shù)據(jù)輸出到一個(gè)excel中,將工資小于20000的輸出到另外一個(gè)excel中。
3.5.3 空操作
空操作,顧名思義就是什么也不做,此控件一般作為數(shù)據(jù)流的終點(diǎn)。
任務(wù):修改上面的轉(zhuǎn)換任務(wù),將工資大于等于20000的數(shù)據(jù)輸出,小于20000的數(shù)據(jù)直接丟棄,熟悉空操作控件的使用。
3.5.3 中止
中止是數(shù)據(jù)流的終點(diǎn),如果有數(shù)據(jù)流到此控件處,整個(gè)轉(zhuǎn)換程序?qū)⒅兄?#xff0c;并且在控制臺(tái)輸出報(bào)錯(cuò)信息。此控件一般用來校驗(yàn)數(shù)據(jù),或者調(diào)試程序。
任務(wù):使用中止控件判斷上個(gè)任務(wù)中是否有人的工資低于20000,如果發(fā)現(xiàn)有人的工資低于20000的話,中止程序,并在控制臺(tái)輸出信息。
3.6 Kettle查詢控件
查詢是轉(zhuǎn)換里面的第九個(gè)分類,查詢控件是用來查詢數(shù)據(jù)源里面的數(shù)據(jù),并合并到主數(shù)據(jù)流中。
3.6.1 數(shù)據(jù)庫查詢
數(shù)據(jù)庫查詢就是從數(shù)據(jù)庫里面查詢出數(shù)據(jù),然后跟數(shù)據(jù)流中的數(shù)據(jù)進(jìn)行左連接的一個(gè)過程。左連接的意思是數(shù)據(jù)流中原本的數(shù)據(jù)全部有,但是數(shù)據(jù)庫查詢控件查詢出來的數(shù)據(jù)不一定全部會(huì)列出,只能按照輸入的匹配條件來進(jìn)行關(guān)聯(lián)。
任務(wù):利用表輸入控件獲取到staff表的數(shù)據(jù),然后利用數(shù)據(jù)庫查詢控件查詢到department表的數(shù)據(jù),然后對兩個(gè)表按照dept_id字段進(jìn)行左連接,并預(yù)覽數(shù)據(jù)
3.6.2 流查詢
流查詢控件就是查詢兩條數(shù)據(jù)流中的數(shù)據(jù),然后按照指定的字段做等值匹配。注意:流查詢在查詢前把數(shù)據(jù)都加載到內(nèi)存中,并且只能進(jìn)行等值查詢。
任務(wù):用流查詢控件,將staff和department的數(shù)據(jù)按照dept_id字段進(jìn)行關(guān)聯(lián)起來
3.7 Kettle連接控件
連接是轉(zhuǎn)換里面的第十個(gè)分類,連接分類下的控件一般都是將多個(gè)數(shù)據(jù)集通過關(guān)鍵字進(jìn)行連接起來,形成一個(gè)數(shù)據(jù)集的過程。
3.7.1 合并記錄
合并記錄是用于將兩個(gè)不同來源的數(shù)據(jù)合并,這兩個(gè)來源的數(shù)據(jù)分別為舊數(shù)據(jù)和新數(shù)據(jù),該步驟將舊數(shù)據(jù)和新數(shù)據(jù)按照指定的關(guān)鍵字匹配、比較、合并。注意舊數(shù)據(jù)和新數(shù)據(jù)需要事先按照關(guān)鍵字段排序,并且舊數(shù)據(jù)和新數(shù)據(jù)要有相同的字段名稱。
合并后的數(shù)據(jù)將包括舊數(shù)據(jù)來源和新數(shù)據(jù)來源里的所有數(shù)據(jù),對于變化的數(shù)據(jù),使用新數(shù)據(jù)代替舊數(shù)據(jù),同時(shí)在結(jié)果里用一個(gè)標(biāo)示字段,來指定新舊數(shù)據(jù)的比較結(jié)果。
任務(wù):利用合并記錄控件比較合并記錄-新舊excel的數(shù)據(jù),并預(yù)覽數(shù)據(jù),查看標(biāo)志字段的內(nèi)容
3.7.2 記錄集連接
記錄集連接可以對兩個(gè)步驟中的數(shù)據(jù)流進(jìn)行左連接,右連接,內(nèi)連接,外連接。此控件功能比較強(qiáng)大,企業(yè)做ETL開發(fā)會(huì)經(jīng)常用到此控件,但是需要注意在進(jìn)行記錄集連接之前,需要對記錄集的數(shù)據(jù)進(jìn)行排序,并且排序的字段還一定要選兩個(gè)表關(guān)聯(lián)的字段,否則數(shù)據(jù)錯(cuò)亂,出現(xiàn)null值。
任務(wù):使用記錄集連接控件對數(shù)據(jù)庫表satff和department按照部門id分別進(jìn)行內(nèi)連接,左連接,右連接,外連接,查看數(shù)據(jù)的不同
注意:兩個(gè)表進(jìn)行排序記錄的時(shí)候,排序的字段一定要選擇部門id,否則數(shù)據(jù)會(huì)不正確
統(tǒng)計(jì)是轉(zhuǎn)換里面的第十三個(gè)分類,統(tǒng)計(jì)控件可以提供數(shù)據(jù)的采樣和統(tǒng)計(jì)功能。
3.8.1 分組
分組控件的功能類似于GROUP BY,可以按照指定的一個(gè)或者幾個(gè)字段進(jìn)行分組,然后其余字段可以按照聚合函數(shù)進(jìn)行合并計(jì)算。注意,在進(jìn)行分組之前,數(shù)據(jù)最好先進(jìn)行排序。
任務(wù):給表staff的數(shù)據(jù)按照部門進(jìn)行分組,求出各部門人數(shù)以及各部門員工的平均年齡。
3.9 Kettle映射控件
映射是轉(zhuǎn)換里面的第十八個(gè)分類,映射可以用來定義子轉(zhuǎn)換,方便代碼封裝和重用。
3.9.1 映射
映射(子轉(zhuǎn)換)是用來配置子轉(zhuǎn)換,對子轉(zhuǎn)換進(jìn)行調(diào)用的一個(gè)步驟。
映射輸入規(guī)范是輸入字段,由調(diào)用的轉(zhuǎn)換輸入。
映射輸出規(guī)范是向調(diào)用的轉(zhuǎn)換輸出所有列,不做任何處理。
任務(wù):封裝一個(gè)子轉(zhuǎn)換能夠通過dept_id求出dept_name,然后使用另外一個(gè)轉(zhuǎn)換調(diào)用此子轉(zhuǎn)換,求出數(shù)據(jù)庫staff表id=3的員工的姓名,年齡,部門id,部門姓名,并輸出到控制臺(tái)。
3.10 Kettle腳本控件
腳本是轉(zhuǎn)換的第七個(gè)分類,腳本就是直接通過寫程序代碼完成一些復(fù)雜的操作。
執(zhí)行sql腳本控件就是連接到數(shù)據(jù)庫里面,然后執(zhí)行自己寫的一些sql語句
任務(wù):利用執(zhí)行sql腳本控件將student表數(shù)據(jù)的xxxxx的年齡更新為18。
四 Kettle作業(yè)
4.1 作業(yè)簡介
大多數(shù)ETL項(xiàng)目都需要完成各種各樣的維護(hù)工作。例如,如何傳送文件;驗(yàn)證數(shù)據(jù)庫表是否存在等等。而這些操作都是按照一定順序完成。因?yàn)檗D(zhuǎn)換以并行方式執(zhí)行,就需要一個(gè)可以串行執(zhí)行的作業(yè)來處理這些操作。
一個(gè)作業(yè)包含一個(gè)或者多個(gè)作業(yè)項(xiàng),這些作業(yè)項(xiàng)以某種順序來執(zhí)行。作業(yè)執(zhí)行順序由作業(yè)項(xiàng)之間的跳(job hop)和每個(gè)作業(yè)項(xiàng)的執(zhí)行結(jié)果來決定。
作業(yè)項(xiàng)是作業(yè)的基本構(gòu)成部分。如同轉(zhuǎn)換的步驟,作業(yè)項(xiàng)也可以使用圖標(biāo)的方式圖形化展示。但是,作業(yè)項(xiàng)和轉(zhuǎn)換步驟有下面幾點(diǎn)不同:
4.1.2 作業(yè)跳
作業(yè)的跳是作業(yè)項(xiàng)之間的連接線,他定義了作業(yè)的執(zhí)行路徑。作業(yè)里每個(gè)作業(yè)項(xiàng)的不同運(yùn)行結(jié)果決定了做作業(yè)的不同執(zhí)行路徑。作業(yè)跳一共分為下面三種情況:
①無條件執(zhí)行:不論上一個(gè)作業(yè)項(xiàng)執(zhí)行成功還是失敗,下一個(gè)作業(yè)項(xiàng)都會(huì)執(zhí)行。這是一種藍(lán)色的連接線,上面有一個(gè)鎖的圖標(biāo)。
②當(dāng)運(yùn)行結(jié)果為真時(shí)執(zhí)行:當(dāng)上一個(gè)作業(yè)項(xiàng)的執(zhí)行結(jié)果為真時(shí),執(zhí)行下一個(gè)作業(yè)項(xiàng)。通常在需要無錯(cuò)誤執(zhí)行的情況下使用。這是一種綠色的連接線,上面有一個(gè)對鉤號(hào)的圖標(biāo)。
③當(dāng)運(yùn)行結(jié)果為假時(shí)執(zhí)行:當(dāng)上一個(gè)作業(yè)項(xiàng)的執(zhí)行結(jié)果為假或者沒有成功執(zhí)行是,執(zhí)行下一個(gè)作業(yè)項(xiàng)。這是一種紅色的連接線,上面有一個(gè)紅色的停止圖標(biāo)。
在圖標(biāo)上單擊就可以對跳進(jìn)行設(shè)置。
4.2 作業(yè)初體驗(yàn)
作業(yè)案例:將3.10.1的轉(zhuǎn)換嵌入作業(yè)中執(zhí)行,執(zhí)行成功或者失敗都發(fā)送郵件提醒
五 Kettle使用案例
5.1 轉(zhuǎn)換案例
案例一:把stu1的數(shù)據(jù)按id同步到stu2,stu2有相同id則更新數(shù)據(jù)
(1)在mysql中創(chuàng)建兩張表
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)往兩張表中插入一些數(shù)據(jù)
mysql> insert into stu1 values(1001,'zhangsan',20),(1002,'lisi',18), (1003,'wangwu',23);
mysql> insert into stu2 values(1001,'wukong');
(3)在kettle中新建轉(zhuǎn)換
(4)分別在輸入和輸出中拉出表輸入和插入/更新
(5)雙擊表輸入對象,填寫相關(guān)配置,測試是否成功
(6)雙擊 更新/插入對象,填寫相關(guān)配置
(7)保存轉(zhuǎn)換,啟動(dòng)運(yùn)行,去mysql表查看結(jié)果
注意:如果需要連接mysql數(shù)據(jù)庫,需要先將mysql的連接驅(qū)動(dòng)包復(fù)制到kettle的根目錄下的lib目錄中,否則會(huì)報(bào)錯(cuò)找不到驅(qū)動(dòng)。
5.2 作業(yè)案例
案例二:使用作業(yè)執(zhí)行上述轉(zhuǎn)換,并且額外在表stu2中添加一條數(shù)據(jù),整個(gè)作業(yè)運(yùn)行成功的話發(fā)郵件提醒
(1)新建一個(gè)作業(yè)
(2) 按圖示拉取組件
(3)雙擊Start編輯Start
(4)雙擊轉(zhuǎn)換,選擇案例1保存的文件
(5)雙擊SQL,編輯SQL語句
(6)雙擊發(fā)送郵件,編輯發(fā)送郵件的設(shè)置信息
(7)保存作業(yè)并執(zhí)行,然后去mysql查看結(jié)果和郵件信息
六 Kettle資源庫
6.1 數(shù)據(jù)庫資源庫
數(shù)據(jù)庫資源庫是將作業(yè)和轉(zhuǎn)換相關(guān)的信息存儲(chǔ)在數(shù)據(jù)庫中,執(zhí)行的時(shí)候直接去數(shù)據(jù)庫讀取信息,很容易跨平臺(tái)使用
1)點(diǎn)擊右上角connect,選擇Other Resporitory
2) 選擇Database Repository
3) 建立新連接
4) 填好之后,點(diǎn)擊finish,會(huì)在指定的庫中創(chuàng)建很多表,至此數(shù)據(jù)庫資源庫創(chuàng)建完成
5) 連接資源庫,默認(rèn)賬號(hào)密碼為admin
6) 將之前做過的轉(zhuǎn)換導(dǎo)入資源庫
(1)選擇從xml文件導(dǎo)入
(2)隨便選擇一個(gè)轉(zhuǎn)換
(3)點(diǎn)擊保存,選擇存儲(chǔ)位置及文件名
(4)打開資源庫查看保存結(jié)果
6.2 文件資源庫
將作業(yè)和轉(zhuǎn)換相關(guān)的信息存儲(chǔ)在指定的目錄中,其實(shí)和XML的方式一樣,創(chuàng)建方式跟創(chuàng)建數(shù)據(jù)庫資源庫步驟類似,只是不需要用戶密碼就可以訪問,跨平臺(tái)使用比較麻煩
1)選擇connect
2)點(diǎn)擊add后點(diǎn)擊Other Repositories
3)選擇File Repository
4)填寫信息
七 Kettle調(diào)優(yōu)
1、調(diào)整JVM大小進(jìn)行性能優(yōu)化,修改Kettle根目錄下的Spoon腳本。
參數(shù)參考:
-Xmx2048m:設(shè)置JVM最大可用內(nèi)存為2048M。
-Xms1024m:設(shè)置JVM促使內(nèi)存為1024m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
-Xmn2g:設(shè)置年輕代大小為2G。整個(gè)JVM內(nèi)存大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會(huì)減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8。
-Xss128k:設(shè)置每個(gè)線程的堆棧大小。JDK5.0以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K。更具應(yīng)用的線程所需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗(yàn)值在3000~5000左右。
2、 調(diào)整提交(Commit)記錄數(shù)大小進(jìn)行優(yōu)化,Kettle默認(rèn)Commit數(shù)量為:1000,可以根據(jù)數(shù)據(jù)量大小來設(shè)置Commitsize:1000~50000
3、盡量使用數(shù)據(jù)庫連接池;
4、盡量提高批處理的commit size;
5、盡量使用緩存,緩存盡量大一些(主要是文本文件和數(shù)據(jù)流);
6、Kettle是Java做的,盡量用大一點(diǎn)的內(nèi)存參數(shù)啟動(dòng)Kettle;
7、可以使用sql來做的一些操作盡量用sql;
Group , merge , stream lookup,split field這些操作都是比較慢的,想辦法避免他們.,能用sql就用sql;
8、插入大量數(shù)據(jù)的時(shí)候盡量把索引刪掉;
9、盡量避免使用update , delete操作,尤其是update,如果可以把update變成先delete, 后insert;
10、能使用truncate table的時(shí)候,就不要使用deleteall row這種類似sql合理的分區(qū),如果刪除操作是基于某一個(gè)分區(qū)的,就不要使用delete row這種方式(不管是deletesql還是delete步驟),直接把分區(qū)drop掉,再重新創(chuàng)建;
11、盡量縮小輸入的數(shù)據(jù)集的大小(增量更新也是為了這個(gè)目的);
12、盡量使用數(shù)據(jù)庫原生的方式裝載文本文件(Oracle的sqlloader, mysql的bulk loader步驟)。
漫話架構(gòu)之美
大數(shù)據(jù)領(lǐng)域原創(chuàng)技術(shù)號(hào),專注于大數(shù)據(jù)研究,包括 Hadoop、Flink、Spark、Kafka、Hive、HBase 等,深入大數(shù)據(jù)技術(shù)原理,數(shù)據(jù)倉庫,數(shù)據(jù)治理,前沿大數(shù)據(jù)技術(shù)
總結(jié)
以上是生活随笔為你收集整理的【ETL工具】-Kettle详细教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交换机芯片笔记1.1
- 下一篇: ionic app 开发学习