【尚硅谷】大數(shù)據(jù)技術(shù)之Kettle視頻教程

尚硅谷大數(shù)據(jù)技術(shù)之Kettle?
(作者:尚硅谷大數(shù)據(jù)研發(fā)部)
版本:V2.0
第1章 Kettle概述
1.1 ETL簡(jiǎn)介
ETL(Extract-Transform-Load的縮寫(xiě),即數(shù)據(jù)抽取、轉(zhuǎn)換、裝載的過(guò)程),對(duì)于企業(yè)或行業(yè)應(yīng)用來(lái)說(shuō),我們經(jīng)常會(huì)遇到各種數(shù)據(jù)的處理,轉(zhuǎn)換,遷移,所以了解并掌握一種ETL工具的使用,必不可少。
市面上常用的ETL工具有很多,比如Sqoop,DataX,Kettle,Talend等,作為一個(gè)大數(shù)據(jù)工程師,我們最好要掌握其中的兩到三種,這里我們要學(xué)習(xí)的ETL工具是Kettle!
1.2 Kettle簡(jiǎn)介
1.2.1 Kettle是什么
Kettle是一款國(guó)外開(kāi)源的ETL工具,純java編寫(xiě),可以在Window、Linux、Unix上運(yùn)行,綠色無(wú)需安裝,數(shù)據(jù)抽取高效穩(wěn)定。
Kettle 中文名稱(chēng)叫水壺,該項(xiàng)目的主程序員MATT 希望把各種數(shù)據(jù)放到一個(gè)壺里,然后以一種指定的格式流出。
Kettle這個(gè)ETL工具集,它允許你管理來(lái)自不同數(shù)據(jù)庫(kù)的數(shù)據(jù),通過(guò)提供一個(gè)圖形化的用戶(hù)環(huán)境來(lái)描述你想做什么,而不是你想怎么做。
Kettle中有兩種腳本文件,transformation和job,transformation完成針對(duì)數(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)
?
第2章 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目錄說(shuō)明
2.1.3?Kettle文件說(shuō)明
2.2 Kettle安裝部署
2.2.1 概述
在實(shí)際企業(yè)開(kāi)發(fā)中,都是在本地Windows環(huán)境下進(jìn)行kettle的job和Transformation開(kāi)發(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界面簡(jiǎn)介
2.3.1 首頁(yè)
?
2.3.2 轉(zhuǎn)換
2.3.3 作業(yè)
?
2.4 Kettle轉(zhuǎn)換初次體驗(yàn)
體驗(yàn)案例:將csv文件用Kettle轉(zhuǎn)換成excel文件
?
?
1)?在Kettle中新建一個(gè)轉(zhuǎn)換,然后選擇轉(zhuǎn)換下面的“csv文件輸入”和“Excel輸出”控件
?
2)?雙擊CSV文件輸入文件控件,在彈出的設(shè)置框里找到對(duì)應(yīng)的csv文件(尚硅谷大數(shù)據(jù)技術(shù)之Kettle\5.數(shù)據(jù)\input\01_kettle快速體驗(yàn).csv),然后點(diǎn)擊下面的獲取字段按鈕,將我們需要的字段加載到kettle中
?
3)按住鍵盤(pán)SHIFT鍵,并且點(diǎn)擊鼠標(biāo)左鍵將兩個(gè)控件鏈接起來(lái),鏈接時(shí)選擇“主輸出步驟”
?
?
?
4)雙擊Excel輸出控件,在彈出的設(shè)置框里設(shè)置文件輸出路徑和文件名稱(chēng),然后點(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可以被歸類(lèi)為可視化編程語(yǔ)言(Visula Programming Languages,VPL),因?yàn)镵ettle可以使用圖形化的方式定義復(fù)雜的ETL程序和工作流。
可視化編程一直是Kettle里的核心概念,它可以讓你快速構(gòu)建復(fù)雜的ETL作業(yè)和減低維護(hù)工作量。它通過(guò)隱藏很多技術(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) 組成,如文本文件輸入,過(guò)濾輸出行,執(zhí)行 SQL 腳本等。各個(gè)步驟使用跳?(Hop) 來(lái)鏈接。 跳定義了一個(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)換里的基本的組成部分,快速入門(mén)的案例中就存在兩個(gè)步驟,“CSV文件輸入”和“Excel輸出”。
一個(gè)步驟有如下幾個(gè)關(guān)鍵特性:
①步驟需要有一個(gè)名字,這個(gè)名字在同一個(gè)轉(zhuǎn)換范圍內(nèi)唯一。
②每個(gè)步驟都會(huì)讀、寫(xiě)數(shù)據(jù)行(唯一例外是“生成記錄”步驟,該步驟只寫(xiě)數(shù)據(jù))。
③步驟將數(shù)據(jù)寫(xiě)到與之相連的一個(gè)或多個(gè)輸出跳(hop),再傳送到跳的另一端的步驟。
④大多數(shù)的步驟都可以有多個(gè)輸出跳。一個(gè)步驟的數(shù)據(jù)發(fā)送可以被設(shè)置為分發(fā)和復(fù)制,分發(fā)是目標(biāo)步驟輪流接收記錄,復(fù)制是所有的記錄被同時(shí)發(fā)送到所有的目標(biāo)步驟。
?????????????
2.5.4 跳(Hop)
跳就是步驟之間帶箭頭的連線(xiàn),跳定義了步驟之間的數(shù)據(jù)通路。
?
跳實(shí)際上是兩個(gè)步驟之間的被稱(chēng)之為行集的數(shù)據(jù)行緩存,行集的大小可以在轉(zhuǎn)換的設(shè)置里定義。當(dāng)行集滿(mǎn)了,向行集寫(xiě)數(shù)據(jù)的步驟將停止寫(xiě)入,直到行集里又有了空間。當(dāng)行集空了,從行集讀取數(shù)據(jù)的步驟停止讀取,直到行集里又有可讀的數(shù)據(jù)行。
?
2.5.5 元數(shù)據(jù)
每個(gè)步驟在輸出數(shù)據(jù)行時(shí)都有對(duì)字段的描述,這種描述就是數(shù)據(jù)行的元數(shù)據(jù)。
通常包含下面一些信息。
①名稱(chēng):數(shù)據(jù)行里的字段名是唯一的。
②數(shù)據(jù)類(lèi)型:字段的數(shù)據(jù)類(lèi)型。
③格式:數(shù)據(jù)顯示的方式,如Integer的#、0.00。
④長(zhǎng)度:字符串的長(zhǎng)度或者BigNumber類(lèi)型的長(zhǎng)度。
⑤精度:BigNumber數(shù)據(jù)類(lèi)型的十進(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ù)值類(lèi)型數(shù)據(jù)的分組符號(hào),不同文化背景下數(shù)字里的分組符號(hào)也是不同的,一般是點(diǎn)(.)或逗號(hào)(,)或單引號(hào)(’)
?
2.5.6 數(shù)據(jù)類(lèi)型
數(shù)據(jù)以數(shù)據(jù)行的形式沿著步驟移動(dòng)。一個(gè)數(shù)據(jù)行是零到多個(gè)字段的集合,字段包含下面幾種數(shù)據(jù)類(lèi)型。
①String:字符類(lèi)型數(shù)據(jù)
②Number:雙精度浮點(diǎn)數(shù)。
③Integer:帶符號(hào)長(zhǎng)整型(64位)。
④BigNumber:任意精度數(shù)據(jù)。
⑤Date:帶毫秒精度的日期時(shí)間值。
⑥Boolean:取值為true和false的布爾值。
⑦Binary:二進(jìn)制字段可以包含圖像、聲音、視頻及其他類(lèi)型的二進(jìn)制數(shù)據(jù)。
?
2.5.7 并行
跳的這種基于行集緩存的規(guī)則允許每個(gè)步驟都是由一個(gè)獨(dú)立的線(xiàn)程運(yùn)行,這樣并發(fā)程度最高。這一規(guī)則也允許數(shù)據(jù)以最小消耗內(nèi)存的數(shù)據(jù)流的方式來(lái)處理。在數(shù)據(jù)倉(cāng)庫(kù)里,我們經(jīng)常要處理大量數(shù)據(jù),所以這種高并發(fā)低消耗的方式也是ETL工具的核心需求。
對(duì)于kettle的轉(zhuǎn)換,不能定義一個(gè)執(zhí)行順序,因?yàn)樗胁襟E都以并發(fā)方式執(zhí)行:當(dāng)轉(zhuǎn)換啟動(dòng)后,所有步驟都同時(shí)啟動(dòng),從它們的輸入跳中讀取數(shù)據(jù),并把處理過(guò)的數(shù)據(jù)寫(xiě)到輸出跳,直到輸入跳里不再有數(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)度工具來(lái)執(zhí)行轉(zhuǎn)換,這就是 Kettle中的作業(yè)。
第3章 Kettle轉(zhuǎn)換
3.1 Kettle輸入控件
輸入是轉(zhuǎn)換里面的第一個(gè)分類(lèi),輸入控件也是轉(zhuǎn)換中的第一大控件,用來(lái)抽取數(shù)據(jù)或者生成數(shù)據(jù)。輸入是ETL里面的E(Extract),主要做數(shù)據(jù)提取的工作。
?
由于Kettle中自帶的輸入控件比較多,本文只挑出開(kāi)發(fā)中經(jīng)常使用的幾個(gè)輸入控件來(lái)進(jìn)行講解,詳情如下圖。
?
3.1.1 CSV文件輸入
CSV文件是一個(gè)用逗號(hào)分隔的固定格式的文本文件,這種文件后綴名為.csv,可以用Excel或者文本編輯器打開(kāi)。在企業(yè)里面一般最常見(jiàn)的ETL需求就是將csv文件轉(zhuǎn)換為excel文件,如果用Kettle來(lái)做這個(gè)ETL工作,就需要用到本章節(jié)講解的CSV文件輸入控件。
本章節(jié)任務(wù):熟悉CSV文件輸入控件,并嘗試將CSV文件轉(zhuǎn)換成Excel文件(可參考上面的快速體驗(yàn)案例)。
?
①?步驟名稱(chēng):可以修改,但是在同一個(gè)轉(zhuǎn)換里面要保證唯一性,見(jiàn)名知意;
②?文件名:選擇對(duì)應(yīng)的csv文件;
③?列分隔符:默認(rèn)是逗號(hào);
④?封閉符:結(jié)束行數(shù)據(jù)的讀寫(xiě);
⑤?NIO緩存大?。何募绻袛?shù)過(guò)多,需要調(diào)整此參數(shù);
⑥?包含列頭行:意思是文件中第一行是字段名稱(chēng)行,表頭不進(jìn)行讀寫(xiě);
⑦?行號(hào)字段:如果文件第一行不是字段名稱(chēng)或者需要從某行開(kāi)始讀寫(xiě),可在此輸入行號(hào)。
⑧?并發(fā)運(yùn)行?:選擇并發(fā),可提高讀寫(xiě)速度;
⑨?字段中有回車(chē)換行?:不要選擇,會(huì)將換行符做數(shù)據(jù)讀出;
⑩?文件編碼:如果預(yù)覽數(shù)據(jù)出現(xiàn)亂碼,可更換文件編碼;
3.1.2 文本文件輸入
提取服務(wù)器上的日志信息是公司里ETL開(kāi)發(fā)很常見(jiàn)的操作,日志信息基本上都是文本類(lèi)型,因此文本文件輸入控件是kettle中常用的一個(gè)輸入控件。使用文本文件輸入控件步驟:
1)?添加需要轉(zhuǎn)換的日志文件
2)?按照日志文件格式,指定分隔符?
3)?獲取下字段,并給字段設(shè)置合適的格式
4)?最后點(diǎn)下預(yù)覽記錄,看看能否讀到數(shù)據(jù)
?
?
?
本章節(jié)任務(wù):熟悉文本文件輸入控件,并新建轉(zhuǎn)換,將txt日志文件轉(zhuǎn)換為Excel文件
?
?
3.1.3 Excel輸入
Excel輸入控件也是很常用的輸入控件,一般企業(yè)里會(huì)用此控件對(duì)大量的Excel文件進(jìn)行ETL操作。使用Excel輸入控件步驟如下:
1)?按照讀取的源文件格式指定對(duì)應(yīng)的表格類(lèi)型為xls還是xlsx
2)?選擇并添加對(duì)應(yīng)的excel文件
3)?獲取excel的sheet工作表
4)?獲取字段,并給每個(gè)字段設(shè)置合適的格式
5)?預(yù)覽數(shù)據(jù)
?
?
?
本章節(jié)任務(wù):熟悉Excel輸入控件,將excel文件的兩個(gè)sheet表格的數(shù)據(jù)重新寫(xiě)到一個(gè)新的excel文件中
?
3.1.4 XML輸入
1)XML簡(jiǎn)介
XML-可擴(kuò)展標(biāo)記語(yǔ)言eXtensible Markup Language,由W3C組織發(fā)布,目前推薦遵守的是W3C組織于2000年發(fā)布的XML1.0規(guī)范。XML用來(lái)傳輸和存儲(chǔ)數(shù)據(jù),就是以一個(gè)統(tǒng)一的格式,組織有關(guān)系的數(shù)據(jù),為不同平臺(tái)下的應(yīng)用程序服務(wù)。
?
2)?XPath簡(jiǎn)介
XPath即為XML路徑語(yǔ)言(XML Path Language),它是一種用來(lái)確定XML文檔中某部分位置的語(yǔ)言。XPath基于XML的樹(shù)狀結(jié)構(gòu),提供在數(shù)據(jù)結(jié)構(gòu)樹(shù)中找尋節(jié)點(diǎn)的能力。
XPath 使用路徑表達(dá)式在 XML 文檔中選取節(jié)點(diǎn)。下面列出了最有用的路徑表達(dá)式:
?
3)?XML輸入控件
了解XML和XPath概念以后,我們要開(kāi)始學(xué)習(xí)Kettle的XML輸入控件,企業(yè)里經(jīng)常用此控件進(jìn)行XML文件的ETL操作。
1.?瀏覽獲取xml文件,將xml文件添加到kettle中
2.?獲取xml文檔的所有路徑,設(shè)置合適的循環(huán)讀取路徑
3.?獲取字段,獲得自己想要讀取的所有字段,并且設(shè)置適當(dāng)?shù)母袷?/p>
4.?預(yù)覽數(shù)據(jù),看看能否讀取到自己想要的數(shù)據(jù)
?
?
?
本章節(jié)任務(wù):熟悉XML輸入控件,將XML文件的學(xué)生數(shù)據(jù)寫(xiě)到excel文件中
?
3.1.5 JSON輸入
1)JSON簡(jiǎn)介
JSON(JavaScript Object Notation, JS 對(duì)象簡(jiǎn)譜) 是一種輕量級(jí)的數(shù)據(jù)交換格式。JSON對(duì)象本質(zhì)上就是一個(gè)JS對(duì)象,但是這個(gè)對(duì)象比較特殊,它可以直接轉(zhuǎn)換為字符串,在不同語(yǔ)言中進(jìn)行傳遞,通過(guò)工具又可以轉(zhuǎn)換為其他語(yǔ)言中的對(duì)象。
JSON核心概念:數(shù)組、對(duì)象、屬性。
數(shù)組:[ ]
對(duì)象:{ }
屬性:key:value
2)JSON Path
JSONPath類(lèi)似于XPath在xml文檔中的定位,JsonPath表達(dá)式通常是用來(lái)路徑檢索或設(shè)置Json的。其表達(dá)式可以接受“dot–notation”(點(diǎn)記法)和“bracket–notation”(括號(hào)記法)格式
點(diǎn)記法:$.store.book[0].title
括號(hào)記法:$[‘store’][‘book’][0][‘title’]
?
3)?JSON輸入控件
了解JSON格式和JSON Path以后,我們要學(xué)習(xí)使用JSON輸入控件,JSON控件也是企業(yè)里做ETL常用的控件之一。
1.?瀏覽獲取JSON文件,將json文件獲取到kettle中
2.?根據(jù)JSON Path點(diǎn)記法,獲取到需要的字段,并且設(shè)置合適格式
?
?
?
?
本章節(jié)任務(wù):獲取到JSON文件里面的id,field,value字段,寫(xiě)到excel文件中
?
?
3.1.6 表輸入
1)創(chuàng)建數(shù)據(jù)庫(kù)連接
表輸入可以說(shuō)是kettle中用到最多的一種輸入控件,因?yàn)槠髽I(yè)中大部分的數(shù)據(jù)都會(huì)存在數(shù)據(jù)庫(kù)中。kettle可以連接市面上常見(jiàn)的各種數(shù)據(jù)庫(kù),比如Oracle,Mysql,SqlServer等。但是在連接各個(gè)數(shù)據(jù)庫(kù)之前,我們需要先配置好對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng),本教程以mysql為例,給大家講解kettle連接mysql數(shù)據(jù)庫(kù)的過(guò)程。
首先我們要將對(duì)應(yīng)版本的mysql連接驅(qū)動(dòng)放到kettle安裝目錄下面的lib文件夾下,然后重啟kettle的客戶(hù)端Spoon
?
重啟Spoon客戶(hù)端以后,我們就可以創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫(kù)連接了,在轉(zhuǎn)換視圖的主對(duì)象樹(shù)目錄下,有個(gè)DB連接,右鍵然后選擇新建,在打開(kāi)數(shù)據(jù)庫(kù)連接框里,填寫(xiě)正確的數(shù)據(jù)庫(kù)信息,然后測(cè)試,測(cè)試無(wú)誤后,可以保存此數(shù)據(jù)庫(kù)連接。
?
數(shù)據(jù)庫(kù)連接默認(rèn)只對(duì)本轉(zhuǎn)換有效,換一個(gè)轉(zhuǎn)換以后,這個(gè)連接就沒(méi)法用了,還需要新建數(shù)據(jù)庫(kù)連接,所以我們需要將建好的這個(gè)數(shù)據(jù)庫(kù)連接進(jìn)行共享下,共享以后,其他的轉(zhuǎn)換也能用我們提前建好的這個(gè)數(shù)據(jù)庫(kù)連接了。
?
2)表輸入
創(chuàng)建好數(shù)據(jù)庫(kù)連接以后,我們就可以使用表輸入控件了,雙擊表輸入控件,選擇剛剛創(chuàng)建的數(shù)據(jù)庫(kù)連接,然后在SQL框里輸入合適的查詢(xún)語(yǔ)句,然后點(diǎn)擊預(yù)覽按鈕,看能否預(yù)覽到我們期望的數(shù)據(jù)。
?
本章節(jié)任務(wù):根據(jù)自己的集群環(huán)境,創(chuàng)建數(shù)據(jù)庫(kù)連接,然后使用表輸入控件將student表的數(shù)據(jù)寫(xiě)到excel中。
?
3.2 Kettle輸出控件
輸出是轉(zhuǎn)換里面的第二個(gè)分類(lèi),輸出控件也是轉(zhuǎn)換中的第二大控件,用來(lái)存儲(chǔ)數(shù)據(jù)。輸出是ETL里面的L(Load),主要做數(shù)據(jù)加載的工作。
由于Kettle中自帶的輸出控件比較多,本文只挑出開(kāi)發(fā)中經(jīng)常使用的幾個(gè)輸出控件來(lái)進(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)很熟悉了,本章不再贅述,接下來(lái)給大家講下Microsoft?Excel輸出。
1)?選擇合適的擴(kuò)展名
2)?點(diǎn)擊瀏覽,補(bǔ)全輸出文件的路徑已經(jīng)文件名
?
本章任務(wù):使用表輸入控件,將student表的數(shù)據(jù),以復(fù)制的方式輸出到xls和xlsx文件中
?
3.2.2 文本文件輸出
文本文件輸出控件,顧名思義,這是一個(gè)能將數(shù)據(jù)輸出成文本的控件,比較簡(jiǎn)單,在企業(yè)里面也比較常用。
1.?設(shè)置對(duì)應(yīng)的目錄和文件名
2.?設(shè)置合適的擴(kuò)展名,比如txt,csv等
3.?在內(nèi)容框里設(shè)置合適的分隔符,比如分號(hào),逗號(hào),TAB等
4.?在字段框里獲取字段,并且給每個(gè)字段設(shè)置合適的格式
?
?
?
本章節(jié)任務(wù):將student表的數(shù)據(jù)復(fù)制兩份,導(dǎo)出成txt和csv文件
?
?
3.2.3 SQL文件輸出
SQL文件輸出一般跟表輸入做連接,然后將數(shù)據(jù)庫(kù)表的表結(jié)構(gòu)和數(shù)據(jù)以sql文件的形式導(dǎo)出,然后做數(shù)據(jù)庫(kù)備份的這么一個(gè)工作。
1.?選擇合適的數(shù)據(jù)庫(kù)連接
2.?選擇目標(biāo)表
3.?勾選增加創(chuàng)建表語(yǔ)句和每個(gè)語(yǔ)句另起一行
4.?填寫(xiě)輸出文件的路徑和文件名
5.?擴(kuò)展名默認(rèn)為sql,這個(gè)不需要更改
?
本章節(jié)任務(wù):將student表的表結(jié)構(gòu)和數(shù)據(jù)利用kettle導(dǎo)出成sql文件備份
?
3.2.4 表輸出
表輸出控件可以將kettle數(shù)據(jù)行中的數(shù)據(jù)直接寫(xiě)入到數(shù)據(jù)庫(kù)中的表中,企業(yè)里做ETL工作會(huì)經(jīng)常用到此控件。
1.?選擇合適的數(shù)據(jù)庫(kù)連接
2.?選擇目標(biāo)表,目標(biāo)表可以提前在數(shù)據(jù)庫(kù)中手動(dòng)創(chuàng)建好,也可以輸入一個(gè)數(shù)據(jù)庫(kù)不存在的表,然后點(diǎn)擊下面的SQL按鈕,利用kettle現(xiàn)場(chǎng)創(chuàng)建
3.?如果目標(biāo)表的表結(jié)構(gòu)和輸入的數(shù)據(jù)結(jié)構(gòu)不一致,還可以自己指定數(shù)據(jù)庫(kù)字段
?
本章節(jié)任務(wù):熟悉表輸出控件,然后將student表的數(shù)據(jù)導(dǎo)入到student2表中,要求利用kettle現(xiàn)場(chǎng)創(chuàng)建student2表
?
3.2.5 更新&插入/更新
更新和插入/更新,這兩個(gè)控件是kettle提供的將數(shù)據(jù)庫(kù)已經(jīng)存在的記錄與數(shù)據(jù)流里面的記錄進(jìn)行對(duì)比的控件。企業(yè)級(jí)ETL經(jīng)常會(huì)用到這兩個(gè)控件來(lái)進(jìn)行數(shù)據(jù)庫(kù)更新的操作
兩者區(qū)別:
更新是將數(shù)據(jù)庫(kù)表中的數(shù)據(jù)和數(shù)據(jù)流中的數(shù)據(jù)做對(duì)比,如果不同就更新,如果數(shù)據(jù)流中的數(shù)據(jù)比數(shù)據(jù)庫(kù)表中的數(shù)據(jù)多,那么就報(bào)錯(cuò)。
插入/更新的功能和更新一樣,只不過(guò)優(yōu)化了數(shù)據(jù)不存在就插入的功能,因此企業(yè)里更多的也是使用插入/更新。
?
?
1.?選擇正確的數(shù)據(jù)庫(kù)連接
2.?選擇目標(biāo)表
3.?輸入兩個(gè)表來(lái)進(jìn)行比較的字段,一般來(lái)說(shuō)都是用主鍵來(lái)進(jìn)行比較
4.?輸入要更新的字段
本章節(jié)任務(wù):手動(dòng)修改下student表的數(shù)據(jù)(修改和新增),然后用修改后的數(shù)據(jù)和student2來(lái)進(jìn)行對(duì)比,分別嘗試更新和插入/更新控件的區(qū)別
??
3.2.6 刪除
刪除控件可以刪除數(shù)據(jù)庫(kù)表中指定條件的數(shù)據(jù),企業(yè)里一般用此控件做數(shù)據(jù)庫(kù)表數(shù)據(jù)刪除或者跟另外一個(gè)表數(shù)據(jù)做對(duì)比,然后進(jìn)行去重的操作。
1.?選擇數(shù)據(jù)庫(kù)連接
2.?選擇目標(biāo)表
3.?設(shè)置數(shù)據(jù)流跟目標(biāo)表要?jiǎng)h除數(shù)據(jù)的對(duì)應(yīng)字段
?
本章節(jié)任務(wù):刪除student2表格中student表里面已有的數(shù)據(jù)(按照student表對(duì)student2表數(shù)據(jù)進(jìn)行去重)
?
3.3 Kettle轉(zhuǎn)換控件
轉(zhuǎn)換控件是轉(zhuǎn)換里面的第四個(gè)分類(lèi),轉(zhuǎn)換控件也是轉(zhuǎn)換中的第三大控件,用來(lái)轉(zhuǎn)換數(shù)據(jù)。轉(zhuǎn)換是ETL里面的T(Transform),主要做數(shù)據(jù)轉(zhuǎn)換,數(shù)據(jù)清洗的工作。ETL整個(gè)過(guò)程中,Transform的工作量最大,耗費(fèi)的時(shí)間也比較久,大概可以占到整個(gè)ETL的三分之二。
由于Kettle中自帶的轉(zhuǎn)換控件比較多,本文只挑出開(kāi)發(fā)中經(jīng)常使用的幾個(gè)轉(zhuǎn)換控件來(lái)進(jìn)行講解,詳情如下圖。
?
3.3.1 Concat?fields
轉(zhuǎn)換控件Concat fields,顧名思義,就是將多個(gè)字段連接起來(lái)形成一個(gè)新的字段。
?
本章節(jié)任務(wù):將staff表的firstname和lastname拼接起來(lái),形成name字段,然后再將數(shù)據(jù)插入到新表emp中
提示:如果涉及到中文亂碼問(wèn)題,請(qǐng)參考資料:Mysql中文亂碼問(wèn)題.docx
?
3.3.2 值映射
值映射就是把字段的一個(gè)值映射成其他的值。在數(shù)據(jù)質(zhì)量規(guī)范上使用非常多,比如很多系統(tǒng)對(duì)應(yīng)性別sex字段的定義不同。所以我們需要利用此控件,將同一個(gè)字段的不同的值,映射轉(zhuǎn)換成我們需要的值。
1.?選擇映射的字段
2.?還可以自定義映射完以后的新字段名
3.?可以設(shè)置不匹配時(shí)的默認(rèn)值
4.?設(shè)置映射的值
?
本章節(jié)任務(wù):將staff表的sex字段,映射成男or女,然后再插入到emp表中
?
3.3.3 增加常量&增加序列
增加常量就是在本身的數(shù)據(jù)流里面添加一列數(shù)據(jù),該列的數(shù)據(jù)都是相同的值。
增加序列是給數(shù)據(jù)流添加一個(gè)序列字段,可以自定義該序列字段的遞增步長(zhǎng)。
?
?
?
?
本章節(jié)任務(wù):給表staff的數(shù)據(jù)加一列固定值slary和一個(gè)遞增的number序列,在控制臺(tái)預(yù)覽下數(shù)據(jù)即可,不用輸出。
?
3.3.4 字段選擇
字段選擇是從數(shù)據(jù)流中選擇字段、改變名稱(chēng)、修改數(shù)據(jù)類(lèi)型。
?
?
?
本章節(jié)任務(wù):在上一章節(jié)的轉(zhuǎn)換之后,添加字段選擇控件,移除掉firstname字段,并且將lastname重命名為name,將slary重命名為money,然后再次預(yù)覽數(shù)據(jù),查看數(shù)據(jù)的變化
?
3.3.5 計(jì)算器
計(jì)算器是一個(gè)函數(shù)集合來(lái)創(chuàng)建新的字段,還可以設(shè)置字段是否移除(臨時(shí)字段)。我們可以通過(guò)計(jì)算器里面的多個(gè)計(jì)算函數(shù)對(duì)已有字段進(jìn)行計(jì)算,得出新字段。
?
?
本章節(jié)任務(wù):在上一節(jié)的任務(wù)基礎(chǔ)之上,添加計(jì)算器控件對(duì)money和number字段進(jìn)行相乘,得出新字段acount,然后預(yù)覽數(shù)據(jù)。
?
?
3.3.6 字符串剪切&替換&操作
轉(zhuǎn)換控件中有三個(gè)關(guān)于字符串的控件,分別是剪切字符串,字符串操作,字符串替換
剪切字符串是指定輸入流字段裁剪的位置剪切出新的字段。
字符串替換是指定搜索內(nèi)容和替換內(nèi)容,如果輸入流的字段匹配上搜索內(nèi)容就進(jìn)行替換生成新字段。
?
字符串操作是去除字符串兩端的空格和大小寫(xiě)切換,并生成新的字段。
?
本章節(jié)任務(wù):在上一節(jié)任務(wù)之后,添加剪切字符串,字符串替換,字符串操作三個(gè)控件,利用這三個(gè)控件分別對(duì)sex字段進(jìn)行剪切,替換,操作(去空格,轉(zhuǎn)大小寫(xiě))
?
?
3.3.7 排序記錄&去除重復(fù)記錄
去除重復(fù)記錄是去除數(shù)據(jù)流里面相同的數(shù)據(jù)行。但是此控件使用之前要求必須先對(duì)數(shù)據(jù)進(jìn)行排序,對(duì)數(shù)據(jù)排序用的控件是排序記錄,排序記錄控件可以按照指定字段的升序或者降序?qū)?shù)據(jù)流進(jìn)行排序。因此排序記錄+去除重復(fù)記錄控件常常配合組隊(duì)使用。
?
本章節(jié)任務(wù):利用excel輸入控件讀取input目錄下的06_去除重復(fù)記錄.xlsx,然后對(duì)里面重復(fù)的數(shù)據(jù)進(jìn)行按照id排序并去重
?
3.3.8 唯一行(哈希值)
唯一行(哈希值)就是刪除數(shù)據(jù)流重復(fù)的行。此控件的效果和(排序記錄+去除重復(fù)記錄)的效果是一樣的,但是實(shí)現(xiàn)的原理不同。排序記錄+去除重復(fù)記錄對(duì)比的是每?jī)尚兄g的數(shù)據(jù),而唯一行(哈希值)是給每一行的數(shù)據(jù)建立哈希值,通過(guò)哈希值來(lái)比較數(shù)據(jù)是否重復(fù),因此唯一行(哈希值)去重效率比較高,也更建議大家使用。
?
本章節(jié)任務(wù):利用唯一行(哈希值)控件對(duì)06_去除重復(fù)記錄.xlsx去重,并且查看最后輸出的數(shù)據(jù)跟上個(gè)任務(wù)有何區(qū)別
3.3.9 拆分字段
拆分字段是把字段按照分隔符拆分成兩個(gè)或多個(gè)字段。需要注意的是,字段拆分以后,原字段就會(huì)從數(shù)據(jù)流中消失。
?
本章節(jié)任務(wù):將07_拆分字段.xlsx里面的NBA球星的姓名,拆分成姓跟名。
?
?
3.3.10 列拆分為多行
列拆分為多行就是把指定字段按指定分隔符進(jìn)行拆分為多行,然后其他字段直接復(fù)制。具體效果如下圖:
?
?
1.?選擇要拆分的字段
2.?設(shè)置合適的分割符
3.?設(shè)置分割以后的新字段名
4.?選擇是否輸出新數(shù)據(jù)的排列行號(hào),行號(hào)是否重置
?
本章節(jié)任務(wù):對(duì)08_列拆分為多行.xlsx的數(shù)據(jù)按照hobby字段進(jìn)行拆分為多行,然后將新數(shù)據(jù)輸出到excel文件中,查看數(shù)據(jù)。
?
3.3.11 行扁平化
行扁平化就是把同一組的多行數(shù)據(jù)合并成為一行,可以理解為列拆分為多行的逆向操作。但是需要注意的是行扁平化控件使用有兩個(gè)條件:
1)?使用之前需要對(duì)數(shù)據(jù)進(jìn)行排序
2)?每個(gè)分組的數(shù)據(jù)條數(shù)要保證一致,否則數(shù)據(jù)會(huì)有錯(cuò)亂
?
1.?選擇扁平化的字段
2.?填寫(xiě)目標(biāo)字段,字段個(gè)數(shù)跟每個(gè)分組的數(shù)據(jù)一致
本章節(jié)任務(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ù)的過(guò)程。具體效果如下圖:
?
注意:列轉(zhuǎn)行之前數(shù)據(jù)流必須按照分組字段進(jìn)行排序,否則數(shù)據(jù)會(huì)錯(cuò)亂!
?
1.?關(guān)鍵字段:從數(shù)據(jù)內(nèi)容變成列名的字段
2.?分組字段:列轉(zhuǎn)行,轉(zhuǎn)變以后的分組字段
3.?目標(biāo)字段:增加的列的列名字段
4.?數(shù)據(jù)字段:目標(biāo)字段的數(shù)據(jù)字段
5.?關(guān)鍵字值:數(shù)據(jù)字段查詢(xún)時(shí)的關(guān)鍵字,也可以理解為key
6.?類(lèi)型:要給目標(biāo)字段設(shè)置合適的類(lèi)型,否則會(huì)報(bào)錯(cuò)
本章節(jié)任務(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)?strong>數(shù)據(jù)列。我們也可以簡(jiǎn)單理解為行轉(zhuǎn)列控件是列轉(zhuǎn)行控件的逆向操作。具體如下圖:
?
?
?
1.?Key字段:行轉(zhuǎn)列,生成的列名字段名
2.?字段名稱(chēng):原本數(shù)據(jù)流中的字段名
3.?Key值:Key字段的值,這個(gè)是自己自定義的,一般都跟前面的字段名稱(chēng)一樣
4.?Value字段:對(duì)應(yīng)的Key值的數(shù)據(jù)列的列名
本章節(jié)任務(wù):將input目錄下的11_行轉(zhuǎn)列.xlsx用excel控件輸入,然后行轉(zhuǎn)列,熟悉行轉(zhuǎn)列控件的使用。
?
3.4 Kettle應(yīng)用控件
應(yīng)用是轉(zhuǎn)換控件里面的第五個(gè)分類(lèi),這個(gè)分類(lèi)下是Kettle給我們自帶的一些工具類(lèi)
3.4.1 替換NULL值
替換NULL值,顧名思義就是將數(shù)據(jù)里面的null值替換成其他的值,此控件比較簡(jiǎn)單,但是在企業(yè)里面也會(huì)經(jīng)常用到。
1.?可以選擇替換數(shù)據(jù)流中所有字段的null值
2.?也可以選擇字段,在下面的字段框里面,根據(jù)不同的字段,將null值替換成不同的值
本章節(jié)任務(wù):替換excel數(shù)據(jù)12_替換NULL值.xlsx的bonus列的null值為0
3.4.2 寫(xiě)日志
寫(xiě)日志控件主要是調(diào)試的時(shí)候使用,此控件可以將數(shù)據(jù)流的每行數(shù)據(jù)打印到控制臺(tái),方便我們調(diào)試整個(gè)程序。
1.?選擇日志級(jí)別
2.?可以輸入自定義輸出的語(yǔ)句
3.?選擇要輸出打印的字段
?
本章節(jié)任務(wù):在上個(gè)任務(wù)的基礎(chǔ)之上,添加寫(xiě)日志控件,在控制臺(tái)輸出查看數(shù)據(jù)。
?
3.5 Kettle流程控件
流程是轉(zhuǎn)換里面的第六個(gè)分類(lèi),流程分類(lèi)下的控件主要用來(lái)控制數(shù)據(jù)流程和數(shù)據(jù)流向。
3.5.1 Switch/case
Switch/case控件,最典型的數(shù)據(jù)分類(lèi)控件,可以利用某一個(gè)字段的數(shù)據(jù)的不同的值,讓數(shù)據(jù)流從一路到多路。
?
1.?選擇需要判斷的字段
2.?選擇判斷字段的值的類(lèi)型
3.?填寫(xiě)分類(lèi)數(shù)據(jù)的判斷條件和目標(biāo)步驟
本章節(jié)任務(wù):將excel:13_Switch-Case.xlsx的數(shù)據(jù)按照部門(mén)字段進(jìn)行分類(lèi),將同一個(gè)部門(mén)的數(shù)據(jù)輸出到一個(gè)excel中
?
3.5.2 過(guò)濾記錄
和Switch/case做對(duì)比的話(huà),過(guò)濾記錄相當(dāng)于if-else,可以自定義輸入一個(gè)判斷條件,然后將數(shù)據(jù)流中的數(shù)據(jù)一路分為兩路。
?
1.?在下面先填寫(xiě)數(shù)據(jù)的判斷條件
2.?然后再上面選擇下判斷條件為true或者false的輸出步驟
本章節(jié)任務(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)。
本章節(jié)任務(wù):修改上節(jié)的轉(zhuǎn)換任務(wù),將工資大于等于20000的數(shù)據(jù)輸出,小于20000的數(shù)據(jù)直接丟棄,熟悉空操作控件的使用。
?
3.5.3 中止
中止是數(shù)據(jù)流的終點(diǎn),如果有數(shù)據(jù)流到此控件處,整個(gè)轉(zhuǎn)換程序?qū)⒅兄?,并且在控制臺(tái)輸出報(bào)錯(cuò)信息。此控件一般用來(lái)校驗(yàn)數(shù)據(jù),或者調(diào)試程序。
?
本章節(jié)任務(wù):使用中止控件判斷上節(jié)任務(wù)中是否有人的工資低于20000,如果發(fā)現(xiàn)有人的工資低于20000的話(huà),中止程序,并在控制臺(tái)輸出信息。
?
3.6 Kettle查詢(xún)控件
查詢(xún)是轉(zhuǎn)換里面的第九個(gè)分類(lèi),查詢(xún)控件是用來(lái)查詢(xún)數(shù)據(jù)源里面的數(shù)據(jù),并合并到主數(shù)據(jù)流中。
3.6.1 數(shù)據(jù)庫(kù)查詢(xún)
數(shù)據(jù)庫(kù)查詢(xún)就是從數(shù)據(jù)庫(kù)里面查詢(xún)出數(shù)據(jù),然后跟數(shù)據(jù)流中的數(shù)據(jù)進(jìn)行左連接的一個(gè)過(guò)程。左連接的意思是數(shù)據(jù)流中原本的數(shù)據(jù)全部有,但是數(shù)據(jù)庫(kù)查詢(xún)控件查詢(xún)出來(lái)的數(shù)據(jù)不一定全部會(huì)列出,只能按照輸入的匹配條件來(lái)進(jìn)行關(guān)聯(lián)。
?
1.?選擇合適的數(shù)據(jù)庫(kù)鏈接
2.?輸入要去數(shù)據(jù)庫(kù)里面查詢(xún)的表名
3.?輸入兩個(gè)表進(jìn)行左連接的連接條件
4.?獲取返回字段,得到查詢(xún)表返回的值
本章節(jié)任務(wù):利用表輸入控件獲取到staff表的數(shù)據(jù),然后利用數(shù)據(jù)庫(kù)查詢(xún)控件查詢(xún)到department表的數(shù)據(jù),然后對(duì)兩個(gè)表按照dept_id字段進(jìn)行左連接,并預(yù)覽數(shù)據(jù)
?
3.6.2 流查詢(xún)
流查詢(xún)控件就是查詢(xún)兩條數(shù)據(jù)流中的數(shù)據(jù),然后按照指定的字段做等值匹配。注意:流查詢(xún)?cè)诓樵?xún)前把數(shù)據(jù)都加載到內(nèi)存中,并且只能進(jìn)行等值查詢(xún)。
?
1.?輸入查詢(xún)的數(shù)據(jù)流
2.?輸入兩個(gè)流進(jìn)行匹配的字段(等值匹配)
3.?輸入查詢(xún)出的字段
本章節(jié)任務(wù):用流查詢(xún)控件,將staff和department的數(shù)據(jù)按照dept_id字段進(jìn)行關(guān)聯(lián)起來(lái)
?
3.7 Kettle連接控件
連接是轉(zhuǎn)換里面的第十個(gè)分類(lèi),連接分類(lèi)下的控件一般都是將多個(gè)數(shù)據(jù)集通過(guò)關(guān)鍵字進(jìn)行連接起來(lái),形成一個(gè)數(shù)據(jù)集的過(guò)程。
3.7.1 合并記錄
合并記錄是用于將兩個(gè)不同來(lái)源的數(shù)據(jù)合并,這兩個(gè)來(lái)源的數(shù)據(jù)分別為舊數(shù)據(jù)和新數(shù)據(jù),該步驟將舊數(shù)據(jù)和新數(shù)據(jù)按照指定的關(guān)鍵字匹配、比較、合并。注意舊數(shù)據(jù)和新數(shù)據(jù)需要事先按照關(guān)鍵字段排序,并且舊數(shù)據(jù)和新數(shù)據(jù)要有相同的字段名稱(chēng)。
合并后的數(shù)據(jù)將包括舊數(shù)據(jù)來(lái)源和新數(shù)據(jù)來(lái)源里的所有數(shù)據(jù),對(duì)于變化的數(shù)據(jù),使用新數(shù)據(jù)代替舊數(shù)據(jù),同時(shí)在結(jié)果里用一個(gè)標(biāo)示字段,來(lái)指定新舊數(shù)據(jù)的比較結(jié)果。
?
1.?舊數(shù)據(jù)源:選擇舊數(shù)據(jù)來(lái)源的步驟
2.?新數(shù)據(jù)源:選擇新數(shù)據(jù)來(lái)源的步驟
3.?標(biāo)志字段:設(shè)置標(biāo)志字段的名稱(chēng),標(biāo)志字段用于保存比較的結(jié)果,比較結(jié)果有下列幾種
①?“identical” – 舊數(shù)據(jù)和新數(shù)據(jù)一樣
②?“changed” – 數(shù)據(jù)發(fā)生了變化;
③?“new” – 新數(shù)據(jù)中有而舊數(shù)據(jù)中沒(méi)有的記錄
④?“deleted” –舊數(shù)據(jù)中有而新數(shù)據(jù)中沒(méi)有的記錄
4.?關(guān)鍵字段:用于定位判斷兩個(gè)數(shù)據(jù)源中的同一條記錄的字段。
5.?比較字段:對(duì)于兩個(gè)數(shù)據(jù)源中的同一條記錄,指定需要比較的字段
本章節(jié)任務(wù):利用合并記錄控件比較合并記錄-新舊excel的數(shù)據(jù),并預(yù)覽數(shù)據(jù),查看標(biāo)志字段的內(nèi)容
?
?
?
3.7.2 記錄集連接
記錄集連接可以對(duì)兩個(gè)步驟中的數(shù)據(jù)流進(jìn)行左連接,右連接,內(nèi)連接,外連接。此控件功能比較強(qiáng)大,企業(yè)做ETL開(kāi)發(fā)會(huì)經(jīng)常用到此控件,但是需要注意在進(jìn)行記錄集連接之前,需要對(duì)記錄集的數(shù)據(jù)進(jìn)行排序,并且排序的字段還一定要選兩個(gè)表關(guān)聯(lián)的字段,否則數(shù)據(jù)錯(cuò)亂,出現(xiàn)null值。
?
1.?選擇需要連接的兩個(gè)數(shù)據(jù)流的步驟
2.?選擇連接類(lèi)型,一共有四個(gè):INNER,LEFT OUTER,RIGHT OUTER,F(xiàn)ULL OUTER
3.?從兩個(gè)數(shù)據(jù)流步驟里面選出連接字段
本章節(jié)任務(wù):使用記錄集連接控件對(duì)數(shù)據(jù)庫(kù)表satff和department按照部門(mén)id分別進(jìn)行內(nèi)連接,左連接,右連接,外連接,查看數(shù)據(jù)的不同
注意:兩個(gè)表進(jìn)行排序記錄的時(shí)候,排序的字段一定要選擇部門(mén)id,否則數(shù)據(jù)會(huì)不正確
?
3.8?Kettle統(tǒng)計(jì)控件
統(tǒng)計(jì)是轉(zhuǎn)換里面的第十三個(gè)分類(lèi),統(tǒng)計(jì)控件可以提供數(shù)據(jù)的采樣和統(tǒng)計(jì)功能。
3.8.1 分組
分組控件的功能類(lèi)似于GROUP BY,可以按照指定的一個(gè)或者幾個(gè)字段進(jìn)行分組,然后其余字段可以按照聚合函數(shù)進(jìn)行合并計(jì)算。注意,在進(jìn)行分組之前,數(shù)據(jù)最好先進(jìn)行排序。
?
1.?選擇分組字段
2.?給其余字段選擇合適的聚合函數(shù)進(jìn)行計(jì)算
本章節(jié)任務(wù):給表staff的數(shù)據(jù)按照部門(mén)進(jìn)行分組,求出各部門(mén)人數(shù)以及各部門(mén)員工的平均年齡。
?
3.9 Kettle映射控件
映射是轉(zhuǎn)換里面的第十八個(gè)分類(lèi),映射可以用來(lái)定義子轉(zhuǎn)換,方便代碼封裝和重用。
3.9.1 映射
映射(子轉(zhuǎn)換)是用來(lái)配置子轉(zhuǎn)換,對(duì)子轉(zhuǎn)換進(jìn)行調(diào)用的一個(gè)步驟。
?
映射輸入規(guī)范是輸入字段,由調(diào)用的轉(zhuǎn)換輸入。
映射輸出規(guī)范是向調(diào)用的轉(zhuǎn)換輸出所有列,不做任何處理。
?
本章節(jié)任務(wù):封裝一個(gè)子轉(zhuǎn)換能夠通過(guò)dept_id求出dept_name,然后使用另外一個(gè)轉(zhuǎn)換調(diào)用此子轉(zhuǎn)換,求出數(shù)據(jù)庫(kù)staff表id=3的員工的姓名,年齡,部門(mén)id,部門(mén)姓名,并輸出到控制臺(tái)。
??
???
3.10 Kettle腳本控件
腳本是轉(zhuǎn)換的第七個(gè)分類(lèi),腳本就是直接通過(guò)寫(xiě)程序代碼完成一些復(fù)雜的操作。
3.10.1?執(zhí)行SQL腳本
執(zhí)行sql腳本控件就是連接到數(shù)據(jù)庫(kù)里面,然后執(zhí)行自己寫(xiě)的一些sql語(yǔ)句
?
1.?選擇合適的數(shù)據(jù)庫(kù)連接
2.?填入要執(zhí)行的sql語(yǔ)句
本章節(jié)任務(wù):利用執(zhí)行sql腳本控件將student表數(shù)據(jù)的atguigu的年齡更新為18。
?
第4章 Kettle作業(yè)
4.1 作業(yè)簡(jiǎn)介
大多數(shù)ETL項(xiàng)目都需要完成各種各樣的維護(hù)工作。例如,如何傳送文件;驗(yàn)證數(shù)據(jù)庫(kù)表是否存在等等。而這些操作都是按照一定順序完成。因?yàn)檗D(zhuǎn)換以并行方式執(zhí)行,就需要一個(gè)可以串行執(zhí)行的作業(yè)來(lái)處理這些操作。
一個(gè)作業(yè)包含一個(gè)或者多個(gè)作業(yè)項(xiàng),這些作業(yè)項(xiàng)以某種順序來(lái)執(zhí)行。作業(yè)執(zhí)行順序由作業(yè)項(xiàng)之間的跳(job hop)和每個(gè)作業(yè)項(xiàng)的執(zhí)行結(jié)果來(lái)決定。
4.1.1?作業(yè)項(xiàng)
作業(yè)項(xiàng)是作業(yè)的基本構(gòu)成部分。如同轉(zhuǎn)換的步驟,作業(yè)項(xiàng)也可以使用圖標(biāo)的方式圖形化展示。但是,作業(yè)項(xiàng)和轉(zhuǎn)換步驟有下面幾點(diǎn)不同:
1.?轉(zhuǎn)換步驟與步驟之間是數(shù)據(jù)流,作業(yè)項(xiàng)之間是步驟流。
2.?轉(zhuǎn)換啟動(dòng)以后,所有步驟一起并行啟動(dòng)等待數(shù)據(jù)行的輸入,而作業(yè)項(xiàng)是嚴(yán)格按照?qǐng)?zhí)行順序啟動(dòng),一個(gè)作業(yè)項(xiàng)執(zhí)行完以后,再執(zhí)行下一個(gè)作業(yè)項(xiàng)。
3.?在作業(yè)項(xiàng)之間可以傳遞一個(gè)結(jié)果對(duì)象(result object)。這個(gè)結(jié)果對(duì)象里面包含了數(shù)據(jù)行,它們不是以數(shù)據(jù)流的方式來(lái)傳遞的。而是等待一個(gè)作業(yè)項(xiàng)執(zhí)行完了,再傳遞個(gè)下一個(gè)作業(yè)項(xiàng)。
4.?因?yàn)樽鳂I(yè)順序執(zhí)行作業(yè)項(xiàng),所以必須定義一個(gè)起點(diǎn)。有一個(gè)叫“開(kāi)始”的作業(yè)項(xiàng)就定義了這個(gè)點(diǎn)。一個(gè)作業(yè)只能定一個(gè)開(kāi)始作業(yè)項(xiàng)。
4.1.2 作業(yè)跳
作業(yè)的跳是作業(yè)項(xiàng)之間的連接線(xiàn),他定義了作業(yè)的執(zhí)行路徑。作業(yè)里每個(gè)作業(yè)項(xiàng)的不同運(yùn)行結(jié)果決定了做作業(yè)的不同執(zhí)行路徑。作業(yè)跳一共分為下面三種情況:
①無(wú)條件執(zhí)行:不論上一個(gè)作業(yè)項(xiàng)執(zhí)行成功還是失敗,下一個(gè)作業(yè)項(xiàng)都會(huì)執(zhí)行。這是一種藍(lán)色的連接線(xià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)。通常在需要無(wú)錯(cuò)誤執(zhí)行的情況下使用。這是一種綠色的連接線(xiàn),上面有一個(gè)對(duì)鉤號(hào)的圖標(biāo)。
?
③當(dāng)運(yùn)行結(jié)果為假時(shí)執(zhí)行:當(dāng)上一個(gè)作業(yè)項(xiàng)的執(zhí)行結(jié)果為假或者沒(méi)有成功執(zhí)行是,執(zhí)行下一個(gè)作業(yè)項(xiàng)。這是一種紅色的連接線(xiàn),上面有一個(gè)紅色的停止圖標(biāo)。
?
在圖標(biāo)上單擊就可以對(duì)跳進(jìn)行設(shè)置。
4.2 作業(yè)初體驗(yàn)
作業(yè)案例:將3.10.1章節(jié)的轉(zhuǎn)換嵌入作業(yè)中執(zhí)行,執(zhí)行成功或者失敗都發(fā)送郵件提醒
1)?點(diǎn)擊左上角的文件,新建一個(gè)作業(yè)
?
2)?按照下圖設(shè)置作業(yè)項(xiàng)和作業(yè)跳
?
3)?轉(zhuǎn)換作業(yè)項(xiàng)設(shè)置,選擇要嵌入的轉(zhuǎn)換文件
?
4)?發(fā)送郵件作業(yè)項(xiàng)設(shè)置,
?
?
5)?分別嘗試作業(yè)執(zhí)行成功和失敗,查看kettle發(fā)送的郵件信息
第5章 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)雙擊表輸入對(duì)象,填寫(xiě)相關(guān)配置,測(cè)試是否成功
?
?
(6)雙擊 更新/插入對(duì)象,填寫(xiě)相關(guān)配置
?
?
(7)保存轉(zhuǎn)換,啟動(dòng)運(yùn)行,去mysql表查看結(jié)果
注意:如果需要連接mysql數(shù)據(jù)庫(kù),需要先將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)行成功的話(huà)發(fā)郵件提醒?
(1)新建一個(gè)作業(yè)
?
(2) 按圖示拉取組件
?
(3)雙擊Start編輯Start
?
(4)雙擊轉(zhuǎn)換,選擇案例1保存的文件
?
(5)雙擊SQL,編輯SQL語(yǔ)句
?
(6)雙擊發(fā)送郵件,編輯發(fā)送郵件的設(shè)置信息
??
?
(7)保存作業(yè)并執(zhí)行,然后去mysql查看結(jié)果和郵件信息
5.3 Hive-HDFS案例
案例三:將hive表的數(shù)據(jù)輸出到hdfs
(1)因?yàn)樯婕暗絟ive和hbase的讀寫(xiě),需要先修改相關(guān)配置文件。
修改kettle安裝目錄下的data-integration\plugins\pentaho-big-data-plugin下的plugin.properties,設(shè)置active.hadoop.configuration=hdp26,并將如下配置文件拷貝到data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp26下
?
(2)啟動(dòng)hdfs,yarn,zookeeper,hbase集群的所有進(jìn)程,啟動(dòng)hiveserver2服務(wù)
[atguigu@hadoop102 ~]$ hadoop.sh?start???//自己寫(xiě)的hadoop啟動(dòng)腳本
[atguigu@hadoop102 ~]$ zk.sh?start //自己寫(xiě)的zookeeper啟動(dòng)腳本
[atguigu@hadoop102 ~]$ /opt/module/hbase-1.3.1/bin/start-hbase.sh
[atguigu@hadoop102 ~]$ /opt/module/hive/bin/hiveserver2
(3)進(jìn)入beeline,查看10000端口開(kāi)啟情況
[atguigu@hadoop102 ~]$ /opt/module/hive/bin/beeline
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop102:10000(回車(chē))
Connecting to jdbc:hive2://hadoop102:10000
Enter username for jdbc:hive2://hadoop102:10000: atguigu(輸入atguigu)
Enter password for jdbc:hive2://hadoop102:10000:(直接回車(chē))
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>(到了這里說(shuō)明成功開(kāi)啟10000端口)
(4)創(chuàng)建兩張表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)插入數(shù)據(jù)
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)設(shè)置表輸入,連接hive
?
?
(8)設(shè)置排序?qū)傩?/p>
?
(9)設(shè)置連接屬性
?
(10)設(shè)置字段選擇
?
(11)設(shè)置文件輸出,點(diǎn)擊瀏覽按鈕
?
選擇存儲(chǔ)路徑為HDFS,并且新建一個(gè)Hadoop?Cluster連接
?
按照集群配置輸入對(duì)應(yīng)的參數(shù)
?
選擇創(chuàng)建好的大數(shù)據(jù)集群連接
?
然后再依次設(shè)置文本文件輸出控件的文件,內(nèi)容,字段三個(gè)設(shè)置頁(yè),注意一定要獲取字段
?
?
(12)保存并運(yùn)行轉(zhuǎn)換,然后查看hdfs
?
5.4 HDFS-Hbase案例
案例四:讀取hdfs文件并將sal大于1000的數(shù)據(jù)保存到hbase中
(1) 在HBase中創(chuàng)建一張表用于存放數(shù)據(jù)
[atguigu@hadoop102 ~]$ /opt/module/hbase-1.3.1/bin/hbase shell
hbase(main):004:0> create 'people','info'
(2)按下圖建立流程圖
?
(3)設(shè)置文件輸入,連接hdfs
?
?
注意千萬(wàn)別忘記獲取字段,然后給字段設(shè)置格式
?
(4)設(shè)置過(guò)濾記錄
?
(5)設(shè)置HBase?output控件
1.選擇一個(gè)大數(shù)據(jù)集群連接
2.選擇上面復(fù)制過(guò)來(lái)的hbase-site.xml
3.去第二個(gè)配置頁(yè)面創(chuàng)建映射,然后保存映射(選擇rowkey字段)
4.再回第一個(gè)配置頁(yè)選擇Hbase表以及剛剛創(chuàng)建好的映射
?
?
注意:若報(bào)錯(cuò)沒(méi)有權(quán)限往hdfs寫(xiě)文件,在Spoon.bat中第119行添加參數(shù)
"-DHADOOP_USER_NAME=atguigu" "-Dfile.encoding=UTF-8"
(6)保存轉(zhuǎn)換并運(yùn)行,然戶(hù)去hbase里面查看數(shù)據(jù)
?
第6章 Kettle資源庫(kù)
6.1 數(shù)據(jù)庫(kù)資源庫(kù)
數(shù)據(jù)庫(kù)資源庫(kù)是將作業(yè)和轉(zhuǎn)換相關(guān)的信息存儲(chǔ)在數(shù)據(jù)庫(kù)中,執(zhí)行的時(shí)候直接去數(shù)據(jù)庫(kù)讀取信息,很容易跨平臺(tái)使用
1)點(diǎn)擊右上角connect,選擇Other?Resporitory
?
2) 選擇Database?Repository
?
3)?建立新連接
?
?
4) 填好之后,點(diǎn)擊finish,會(huì)在指定的庫(kù)中創(chuàng)建很多表,至此數(shù)據(jù)庫(kù)資源庫(kù)創(chuàng)建完成
?
5) 連接資源庫(kù),默認(rèn)賬號(hào)密碼為admin
?
6)?將之前做過(guò)的轉(zhuǎn)換導(dǎo)入資源庫(kù)
(1)選擇從xml文件導(dǎo)入
?
(2)隨便選擇一個(gè)轉(zhuǎn)換
?
(3)點(diǎn)擊保存,選擇存儲(chǔ)位置及文件名
?
(4)打開(kāi)資源庫(kù)查看保存結(jié)果
?
6.2 文件資源庫(kù)
將作業(yè)和轉(zhuǎn)換相關(guān)的信息存儲(chǔ)在指定的目錄中,其實(shí)和XML的方式一樣,創(chuàng)建方式跟創(chuàng)建數(shù)據(jù)庫(kù)資源庫(kù)步驟類(lèi)似,只是不需要用戶(hù)密碼就可以訪問(wèn),跨平臺(tái)使用比較麻煩
1)選擇connect
?
2)點(diǎn)擊add后點(diǎn)擊Other?Repositories
?
3)選擇File?Repository
?
4)填寫(xiě)信息
?
第7章 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ì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8。
-Xss128k:設(shè)置每個(gè)線(xiàn)程的堆棧大小。JDK5.0以后每個(gè)線(xiàn)程堆棧大小為1M,以前每個(gè)線(xiàn)程堆棧大小為256K。更具應(yīng)用的線(xiàn)程所需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線(xiàn)程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線(xiàn)程數(shù)還是有限制的,不能無(wú)限生成,經(jīng)驗(yàn)值在3000~5000左右。
2、 調(diào)整提交(Commit)記錄數(shù)大小進(jìn)行優(yōu)化,Kettle默認(rèn)Commit數(shù)量為:1000,可以根據(jù)數(shù)據(jù)量大小來(lái)設(shè)置Commitsize:1000~50000
3、盡量使用數(shù)據(jù)庫(kù)連接池;
4、盡量提高批處理的commit size;
5、盡量使用緩存,緩存盡量大一些(主要是文本文件和數(shù)據(jù)流);
6、Kettle是Java做的,盡量用大一點(diǎn)的內(nèi)存參數(shù)啟動(dòng)Kettle;
7、可以使用sql來(lái)做的一些操作盡量用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這種類(lèi)似sql合理的分區(qū),如果刪除操作是基于某一個(gè)分區(qū)的,就不要使用delete row這種方式(不管是deletesql還是delete步驟),直接把分區(qū)drop掉,再重新創(chuàng)建;
11、盡量縮小輸入的數(shù)據(jù)集的大?。ㄔ隽扛乱彩菫榱诉@個(gè)目的);
12、盡量使用數(shù)據(jù)庫(kù)原生的方式裝載文本文件(Oracle的sqlloader, mysql的bulk loader步驟)。