kettle使用詳細介紹

目錄

 

一、Kettle安裝、配置

二、Kettle的使用(輸入輸出組件)

1、Test1 csv-excel

2、Test2 json-excel

輸入

輸出

3、Test3 mysql -excelx

輸入

輸出

4、Test4  生成數據-excel

輸入

輸出

5、mysql –文本

輸入

輸出

6、Test6  json  –mysql

輸入

輸出

7、json  –插入/更新(mysql)

輸入

輸出

插入(和上邊不同的只有以下內容)

8、Test8  mysql 刪除數據

輸入

輸出

三、Kettle整合Hadoop

修改配置:

1、打開plugins\pentaho-big-data-plugin\plugin.properties 文件

2、把集羣中的core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml文件拷貝(替換)到kettle的pdi-ce-8.2.0.0-342\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\cdh514目錄下

9、Test9   HDFS –excel

輸入

輸出

10、Test10   json -HDFS

輸入

輸出

四、Kettle整合Hive

11、Test11  hive- –excel

輸入

輸出

12、Test12  excel-hive

輸入

輸出

13、Test13  SQL腳本(Hive)

五、Kettle轉換組件

14、Test14  值映射json-excel

15、Test15  增加序列json-excel

16、Test16選擇字段json-excel

六、Kettle流程控件

17、Test17  switch

18、過濾

七、Kettele連接控件

19、Test19  連接控件-笛卡爾積

20、Test20  記錄集連接

八、Kettle Javascript腳本組件

21、Test21  JS腳本(使用Kettle生成日期維度數據)

需求:

使用Kettle構建以下組件結構圖

組件配置

1、生成記錄組件

2、配置增加序列組件

3、Javascript組件,生成基本時間維度數據

4、配置HttpClient組件

5、配置JSON Input組件

6、配置 switch/case 組件

7、配置工作日、法定節假日、休息日等組件

8、配置字段選擇組件

9、配置parquet輸出

創建表,導入生成的數據

九、Kettle作業和參數

Job(作業)

Job Item(作業項)

Job Hop(作業跳)

22、Test22

參數

23、Test23-表輸入參數傳遞 - 轉換命名參數

謝謝你長得這麼好看還給我點贊


一、Kettle安裝、配置

環境要求:

  • 安裝、配置好JDK

1、下載Kettle

2、解壓Kettle

3、雙擊spoon.bat 啓動spoon

4、操作和mysql相關的的需要在lib目錄下導入mysql驅動包

 

二、Kettle的使用(輸入輸出組件)

Kettle數據流結構圖

 

1、Test1 csv-excel

  1. Kettle中新建轉換
  2. 拖拽一個CSV輸入組件、一個Excel輸出組件、並按住Shift拖動鼠標連接兩個組件
  3. 配置CSV輸入組件、Excel輸出組件

  • 選擇要進行導入的CSV數據源
  • 點擊 「獲取字段」,讀取CSV中的列

  • 點擊 「預覽」,瀏覽CSV中的數據

  • 指定輸出Excel文件的位置

  • 點擊 三角形 箭頭執行

 

2、Test2 json-excel

輸入

輸出

點擊啓動

 

3、Test3 mysql -excelx

輸入

、點擊測試會出現以下彈框

點擊瀏覽

輸出

執行

結果

 

4、Test4  生成數據-excel

輸入

輸出

執行

結果

 

5、mysql –文本

輸入

輸出

執行

結果

 

6、Test6  json  –mysql

輸入

輸出

目標表可以隨便填寫一個數據庫中不存在的表名,之後再SQL那裏可以創建

獲取字段沒有反應的話,先點確定,之後看一下輸入輸出步驟是否處於連接狀態

在未連接狀態是獲取不了字段的

在連接狀態下可以獲取字段

執行

結果

 

7、json  –插入/更新(mysql)

輸入

輸出

執行

結果

插入(和上邊不同的只有以下內容)

!!好像是第一次執行只會插入表結構,第二次執行纔會插入json中的數據!!

 

8、Test8  mysql 刪除數據

輸入

輸出

執行

結果

 

三、Kettle整合Hadoop

修改配置:

1、打開plugins\pentaho-big-data-plugin\plugin.properties 文件

修改 active.hadoop.configuration 爲 active.hadoop.configuration=cdh514

!!這裏的cdh514要根據你自己的hadoop版本來寫!!

 

不修改這裏的配置可能出現的錯誤

    The Active Shim has not been set

此時會彈出 hadoop 版本的基本信息

2、把集羣中的core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml文件拷貝(替換)到kettle的pdi-ce-8.2.0.0-342\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\cdh514目錄下

不修改以上配置可能出現以下錯誤

We couldn't run test User Home Directory Access.

We couldn't run test Root Directory Access.

kettle Unable to load the{0} Shim.

 

9、Test9   HDFS –excel

輸入

輸出

 

10、Test10   json -HDFS

 

輸入

輸出

 

四、Kettle整合Hive

1、從虛擬機下載Hadoopjar
sz /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/common/hadoop-common-2.6.0-
cdh5.14.0.jar

2、把jar包放置在\data-integration\lib目錄下

3、重啓kettle,重新加載生效
 

11、Test11  hive- –excel

hive數據庫是通過jdbc來進行連接,可以通過表輸入控件來獲取數據

準備大數據Hive環境,創建數據表。

準備數據,將數據加載到hive

hive --service hiveserver2 &
hive --service metastore &

1、連接hive

2、創建並切換數據庫
create database test;
use test;

3、創建表

create table a(
a int,
b int
)
row format delimited fields terminated by ',' stored as TEXTFILE;
show tables;

4、創建數據文件

vim a.txt
1,11
2,22
3,33

5、 從文件加載數據到表

load data local inpath '/root/a.txt' into table a;

6、查詢表

select * from a;

輸入

輸出

 

12、Test12  excel-hive

把數據保存到hive數據庫
hive數據庫是通過jdbc來進行連接,可以通過表輸出控件來保存數 據。

輸入

輸出

查看

執行

結構

 

13、Test13  SQL腳本(Hive)

Kettle中可以執行HiveHiveSQL語句,使用作業的SQL腳本。

 

五、Kettle轉換組件

轉換是ETLTT就是 Transform清洗、轉換 ETL三個部分中,T花費時間最 長,一般情況下這部分工作 量是整個ETL2/3

14、Test14  值映射json-excel

值映射就是把字段的一個值映射成其他的值

結果

 

15、Test15  增加序列json-excel

增加序列就是給數據流增加一個序列字段

 

16、Test16選擇字段json-excel

字段選擇是從數據流中選擇字段、改變名稱、修改數據類型

 

六、Kettle流程控件

流程主要用來控制數據流程和數據流向

17、Test17  switch

switch/case組件讓數據流從一路到多路。

 

18、過濾

過濾記錄讓數據流從一路到兩路。

 

七、Kettele連接控件

19、Test19  連接控件-笛卡爾積

 
配置記錄關聯(笛卡爾積組件)【不要任何設置】

 

20、Test20  記錄集連接

記錄集連接類似數據庫的左連接、右連接、內連接、外連接。
在進行記錄集連接之前,應該要對記錄集進行排序

 

八、Kettle Javascript腳本組件

  • Kettle中可以通過腳本完成一些複雜的操作
  • javascript腳本就是使用javascript語言通過代碼編程來完成對數據流的操作
  • JS中有很多內置函數,可以在編寫JS代碼時查看
  • 存在兩種不同的模式不兼容模式和兼容模式
  1. 不兼容模式:是默認的,也是推薦的

  2. 兼容模式:兼容老版本的kettle

對比不兼容模式與兼容模式的差別:

操作
不兼容模式 兼容模式
獲取字段 myVar = fifieldName

myVar = 字段名稱.getString()

myVar = 字段名稱.getNumber()

給字段賦值 字段名 = myVar 字段名.setValue(myVar)
在腳本中使用java var myVar = new java.lang.String("pentahochina.com") var myVar = new Packages.java.lang.String("pentahochina.com")

21、Test21  JS腳本(使用Kettle生成日期維度數據

 

 

需求:

爲了後續分析銷售訂單金額、訂單筆數的周環比、周同比、月環比、月同比,需要提前使用Kettle生成時間維度
工具(環比是相鄰比較,同比是歷史同期比較)
按照以下字段生成 2019年一年的日期維度數據
類型 示例值 中文名
date_key string 20000101 代理鍵
date_value string 2000-01-01 年-月-日
day_in_year string 1 當年的第幾天
day_in_month string 1 當月的第幾天
is_first_day_in_month string y 是否月的第一天
is_last_day_in_month string n 是否月的最後一天
weekday string 星期一 星期
week_in_month string 1 月的第幾個星期
is_first_day_in_week string y、n 是否週一
is_dayoff string y、n 是否休息日
is_workday string y、n 是否工作日
is_holiday string y、n 是否國家法定節假日
date_type string workday、weekend、holiday 工作日、週末、法定節假日 日期類型 工作日:workday 國家法定節假日:holiday 休息日:weekend
month_number string 1、2、..、12 月份
year string 2000 年份
quarter_name string Q1 季度名稱
quarter_number string 1 季度
year_quarter string 2000-Q1 年-季度
year_month_number string 2000-01 年-月份

使用Kettle構建以下組件結構圖

  • 生成記錄

  • 增加序列

  • Javascript代碼

  • Http Client組件(5個並行度)

  • JSON Input

  • Switch/case

  • 字段映射爲常量

    • 工作日

    • 法定節假日

    • 節假日調休補班

    • 休息日

  • 字段選擇

  • Hadoop File Output

組件配置

1、生成記錄組件

2、配置增加序列組件

3、Javascript組件,生成基本時間維度數據

//初始日期
        var initStr = "2019-01-01";
        //轉爲日期對象
        var dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");
        var initDate = dateFormat.parse(initStr);
        //獲取日曆對象
        var calendar = java.util.Calendar.getInstance();

        //設置日曆的時間就是我們的初始時間
        calendar.setTime(initDate);
        //使用日曆加減天,變換日期
        calendar.add(java.util.Calendar.DAY_OF_MONTH, setup);
        //獲取增加一天之後的日期
        var newDate = calendar.getTime();
        var date_value = dateFormat.format(newDate);
        dateFormat.applyPattern("yyyyMMdd");
        var date_key = dateFormat.format(newDate);
        //一年當中第幾天?
       var day_in_year = calendar.get(java.util.Calendar.DAY_OF_YEAR)+"";
        //一月當中第幾天
        var day_in_month = calendar.get(java.util.Calendar.DAY_OF_MONTH)+"";
        //是否是月的第一天
        var is_first_day_in_month = "n";
        if (day_in_month.equals("1")) {
            is_first_day_in_month = "y";
        }
        //是否是月的最後一天
        var is_last_day_in_month = "n";
        calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
        var nextDay = calendar.get(java.util.Calendar.DAY_OF_MONTH) + "";
        if (nextDay.equals("1")) {
            is_last_day_in_month = "y";
        }
        //注意增加之後的日曆對象需要再減回去
        calendar.add(java.util.Calendar.DAY_OF_MONTH, -1);

        //星期幾
       var weekday= (calendar.get(java.util.Calendar.DAY_OF_WEEK)-1)+"";
       //星期日:1,星期六是7
        if(weekday.equals("0")){
            weekday="7";
        }
        //獲取月中第幾周,先減一保證時間正確(我們的規則)
        calendar.add(java.util.Calendar.DAY_OF_MONTH, -1);
        var week_in_month = calendar.get(java.util.Calendar.WEEK_OF_MONTH)+"";
        //再增加回去
        calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
        //是否是週一
        var is_first_day_in_week = "n";
        if (weekday.equals("1")) {
            is_first_day_in_week = "y";
        }

        var is_dayoff = "n";
        var is_workday = "n";
        var is_holiday = "n";
        var date_type = "workday";
        //定義查詢的url
        //var holidayUrl = "https://timor.tech/api/holiday/info/" + date_value;
var holiday_url = "http://wow.kamisamak.com/api.php?date="+date_value
        //月份
        dateFormat.applyPattern("MM");
        var month_number = dateFormat.format(newDate);

        dateFormat.applyPattern("yyyy");
        var year = dateFormat.format(newDate);
        var year_month_number = year + "-" + month_number;
        //季度
        var quarter_name = "";
        var quarter_number = "";
        var year_quarter = "";
		//按照我們的規則,否則默認是國外規則,星期日屬於下個周
        switch (calendar.get(java.util.Calendar.MONTH) + 1) {
            case 1:
            case 2:
            case 3:
                quarter_name = "Q1";
                quarter_number = "1";
                year_quarter = year + "-" + quarter_name;
                break;
            case 4:
            case 5:
            case 6:
                quarter_name = "Q2";
                quarter_number = "2";
                year_quarter = year + "-" + quarter_name;
                break;
            case 7:
            case 8:
            case 9:
                quarter_name = "Q3";
                quarter_number = "3";
                year_quarter = year + "-" + quarter_name;
                break;
            case 10:
            case 11:
            case 12:
                quarter_name = "Q4";
                quarter_number = "4";
                year_quarter = year + "-" + quarter_name;
                break;

        }

4、配置HttpClient組件

可以複製粘貼多個並行執行

5、配置JSON Input組件

6、配置 switch/case 組件

7、配置工作日、法定節假日、休息日等組件

8、配置字段選擇組件

保留需要的字段,刪除不需要的字段

9、配置parquet輸出

創建表,導入生成的數據

CREATE TABLE `date`(
  `date_key` string, 
  `date_value` string, 
  `day_in_year` string, 
  `day_in_month` string, 
  `is_first_day_in_month` string, 
  `is_last_day_in_month` string, 
  `weekday` string, 
  `week_in_month` string, 
  `is_first_day_in_week` string, 
  `is_dayoff` string, 
  `is_workday` string, 
  `is_holiday` string, 
  `date_type` string, 
  `month_number` string, 
  `year` string, 
  `year_month_number` string, 
  `quarter_name` string, 
  `quarter_number` string, 
  `year_quarter` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat';

將kettle生成的數據移動到hdfs這個表的目錄下

修復表

msck repair table 表名

查詢測試

 

九、Kettle作業和參數

Job(作業)

大多數ETL項目都需要完成各種各樣的操作,例如:
  • 如何傳送文件
  • 驗證數據庫表是否存在,等等
而這些操作都是按照一定順序完成,Kettle中的作業可以串行執行轉換來處理這些操作

Job Item(作業項)

作業項是作業的基本構成部分。如同轉換的組件,作業項也可以用圖標的方式展示。

  • 作業順序執行作業項,必須定義一個起點
  • 有一個「start」的作業項專門用來定義起點
  • 一個作業只能定一個開始作業項

Job Hop(作業跳)

Job Hop是作業項之間的連接線,定義了作業的執行路徑,作業裏每個作業項的不同運行結果決定了作業的不同執行
路徑。以下爲 Job Hop的幾種執行方式:
1、無條件執行
  • 不論上一個作業項執行成功還是失敗,下一個作業項都會執行
  • 藍色的連接線,上面有一個鎖的圖標

2、當運行結果爲真時執行
  • 當上一個作業項的執行結果爲真時,執行下一個作業項
  • 通常在需要無錯誤執行的情況下使用
  • 綠色的連接線,上面有一個對鉤號的圖標。

3、當運行結果爲假時執行
  • 當上一個作業項的執行結果爲假或者沒有成功執行時,執行下一個作業項
  • 紅色的連接線,上面有一個紅色的停止圖標
  • 在圖標上單擊就可以對Hop進行設置

22、Test22

實現步驟:
1、設計轉換結構1(從Excel讀取數據,保存到Excel
2、設計轉換結構2(從文本文件中讀取數據,保存到Excel
3、設計作業結構(先執行轉換結構1、再執行轉換結構2
4、運行測試
5、錯誤測試
 
將第一個轉換結構直接終止,並配置拋出一個錯誤
 

 

參數

參數的使用
對於ETL參數傳遞是一個很重要的環節,因爲參
數的傳遞會涉及到業務數據是如何抽取
 

23、Test23-表輸入參數傳遞 - 轉換命名參數

轉換命名參數就是在轉換內部定義的變量,作用範圍是在轉換內部
在轉換的空白處雙擊左鍵,在轉換屬性中能看到可以在表輸入SQL語句中使用 ${變量名} 或者%%變量名%% 直接引用

 

 

 

 

謝謝你長得這麼好看還給我點贊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章