千億級數倉項目第二章(Kettle)

Kettle介紹
對於企業或行業應用來說,經常會遇到各種數據的處理,轉換,遷移,掌握一種etl工具的使用,必不可少,這裏要學習的ETL工具是——Kettle,現在已經更名爲PDI

  • Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝
  • Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺裏,然後以一種指定的格式流出
  • Kettle允許管理來自不同數據庫的數據,提供一個圖形化的用戶環境來描述想做什麼,無需關心怎麼做。
    可視化ETL工具Kettle
    ETL,是英文Extract-Transform-Load的縮寫,用來描述將數據從來源端經過抽取(extract)、轉換(transform)、加載(load)至目的端的過程。ETL一詞較常用在==[數據倉庫],但其對象並不限於[數據倉庫]==。
    Kettle安裝、配置
    環境要求:
  • 安裝、配置好JDK
    1、下載Kettle
  • 資料\安裝包\pdi-ce-8.2.0.0-342.zip
    2、解壓Kettle
    3、雙擊spoon.bat 啓動spoon
    Kettle入門案例
    需求:
  • 把數據從CSV文件(ketttle測試數據\用戶數據源\user.csv)抽取到Excel文件
    數據源:
    在這裏插入圖片描述
    實現步驟:
    1、在Kettle中新建轉換
    2、拖拽一個CSV輸入組件、一個Excel輸出組件、並按住Shift拖動鼠標連接兩個組件
    3、配置CSV輸入組件、Excel輸出組件。
    具體實現:
    1、新建轉換
    2、拖拽一個CSV輸入組件、一個Excel輸出組件、並按住Shift拖動鼠標連接兩個組件。
    在這裏插入圖片描述
    3、配置CSV輸入組件
  • 選擇要進行導入的CSV數據源
  • 點擊 「獲取字段」,讀取CSV中的列
  • 點擊 「預覽」,瀏覽CSV中的數據
    在這裏插入圖片描述
    在這裏插入圖片描述
    4、配置Excel組件
  • 指定輸出Excel文件的位置
    在這裏插入圖片描述
    5、點擊 三角形 箭頭執行
    在這裏插入圖片描述
    Kettle數據流結構圖
    在這裏插入圖片描述

Kettle輸入/輸出組件

輸入組件
JSON數據文件輸入
需求:

  • 資料\kettle測試數據\用戶數據源\user.json 數據文件,通過Kettle,抽取到Excel中。
    在這裏插入圖片描述
    操作步驟:
    1、新建轉換
    2、拽入 JSON input組件、Microsoft Excel輸出組件、並連接兩個組件
    在這裏插入圖片描述
    3、配置 JSON input 組件
    ① 指定JSON文件數據源
    在這裏插入圖片描述
    ② 選擇 JSON 字段
    在這裏插入圖片描述
    4、配置 Excel 輸出 組件
  • 指定Excel文件輸出位置
    在這裏插入圖片描述
    5、啓動執行

表輸入

需求:

  • 將MySQL數據庫中的 user 表中的數據抽取到Excel文件中
    環境準備:
    一、Kettle整合MySQL數據庫
    1、將資料中的 MySQL jdbc 驅動包導入到 pdi-ce-8.2.0.0-342\data-integration\lib 中
    2、重啓 Kettle
    二、MySQL建庫
    1、導入 資料\kettle測試數據\用戶數據源\test_t_user.sql 到 MySQL數據庫中。
    在這裏插入圖片描述
    實現步驟:
    1、拉動 輸入/表輸入 、輸出/Excel輸出 組件、連接兩個組件
    2、配置表輸入
    3、配置Excel輸出組件
    具體操作:
    1、拉動 輸入/表輸入 、輸出/Excel輸出 組件、連接兩個組件
    2、配置表輸入
    2.1 新建數據庫連接
    在這裏插入圖片描述
    2.2 選擇 t_user 表,並獲取SQL查詢語句
    在這裏插入圖片描述
    2.3 預覽數據
    在這裏插入圖片描述
    3、配置Excel輸出組件
  • 指定Excel輸出位置
    在這裏插入圖片描述

生成記錄

數據倉庫中絕大多數的數據都是業務系統生成的動態數據,但是其中一部分維度數據不是動態的,比如:日期維度。靜態維度數據就可以提前生成。
需求:

  • 往 Excel 文件中插入1000條記錄:id爲1,name爲itheima,age爲18
    操作步驟:
    1、拖入 輸入/生成記錄 組件、輸出/Excel輸出 組件、連接兩個組件
    2、配置生成記錄組件
    3、配置Excel輸出
    具體實現:
    1、拖入 輸入/生成記錄 組件、輸出/Excel輸出 組件、連接兩個組件。
    在這裏插入圖片描述
    2、配置生成記錄組件
    在這裏插入圖片描述

輸出組件

文本文件輸出
需求:

  • 從mysql數據庫的test庫的t_user表 抽取數據到文本文件中
    步驟:
    1、拖入 一個 輸入/表輸入、一個 輸出/文本文件輸出、並連接兩個組件
    在這裏插入圖片描述
    2、指定 從哪個表中獲取數據
    3、指定表中的數據輸出到哪個文件

表輸出

  • Json輸出就是把數據寫入指定的表
    需求:
  • 資料\kettle測試數據\用戶數據源\user.json中讀取id, name, age字段的數據,
  • 裝載到mysql數據庫的 t_user_1 表中
    操作步驟:
    1、拖動 輸入/JSON Input組件 ,輸出/表輸出,連接兩個組件
    2、JSON輸入配置
    3、表輸出配置
    具體操作:
    1、拖動 輸入/JSON Input組件 ,輸出/表輸出,連接兩個組件
    在這裏插入圖片描述
    2、JSON輸入配置

在這裏插入圖片描述
3、表輸出配置
在這裏插入圖片描述

插入更新

  • 插入更新就是把數據庫已經存在的記錄與數據流裏面的記錄進行比對
    • 如果不同就進行更新
    • 如果記錄不存在,則會插入數據
      需求:
  • 資料\kettle測試數據\user_new.json 中讀數據,並插入或更新到mysql數據庫的 t_user_1 表中
    操作步驟:
    1、拖入一個 輸入/JSON輸入組件,一個 輸出/插入更新組件、連接兩個組件
    2、配置 JSON輸入組件
    3、配置 插入更新 組件
    4、啓動執行
    具體實現:
    1、拖入一個 輸入/JSON輸入組件,一個 輸出/插入更新組件、連接兩個組件
    在這裏插入圖片描述
    2、配置 JSON輸入組件
    在這裏插入圖片描述
    3、配置 插入更新 組件
    在這裏插入圖片描述
    4、啓動執行

刪除

需求:

  • 從mysql數據庫 t_user_1 表中刪除指定id爲 492456198712198000 的數據
    操作步驟:
    1、拖入一個 輸入/自定義常量數據、輸出/刪除 組件
    2、連接兩個組件
    在這裏插入圖片描述
    3、配置自定義常量數據組件
    在這裏插入圖片描述
    4、配置刪除組件
    在這裏插入圖片描述

Kettle整合大數據平臺

Kettle整合Hadoop
Hadoop環境準備
1、查看hadoop的文件系統

  • 通過瀏覽器訪問

http://node1:50070/

通過終端訪問

hadoop fs -ls / # 查看文件

3、在本地創建1.txt

  • vim 1.txt
id,name
1,itheima
2,itcast

4、上傳1.txt到hadoop文件系統的/hadoop/test目錄

hadoop fs -put 1.txt /hadoop/test

kettle與hahoop環境整合

1、確保Hadoop的環境變量設置好HADOOP_USER_NAME爲root
2、從hadoop下載核心配置文件

sz /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml
sz /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/core-site.xml

文件會被下載到windows的下載目錄
3、把hadoop核心配置文件放入kettle目錄

data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\cdh514
在這裏插入圖片描述

4、修改 data-integration\plugins\pentaho-big-data-plugin\plugin.properties文件

  • 修改plugin.properties
active.hadoop.configuration=cdh514

5、 創建Hadoop clusters
在這裏插入圖片描述
在這裏插入圖片描述

Hadoop file input組件

Kettle在Big data分類中提供了一個Hadoop file input 組件用來從hdfs文件系統中讀取數據。
在這裏插入圖片描述
需求:

  • 從Hadoop文件系統讀取/hadoop/test/1.txt文件,把數據輸入到Excel中。
    實習步驟:
    1、拖入以下組件
    在這裏插入圖片描述
    2、配置Hadoop File Input組件
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

Hadoop file output組件

Kettle在Big data分類中提供了一個Hadoop file output 組件用來向hdfs文件系統中保存數據
在這裏插入圖片描述
需求:

  • 讀取 user.json 把數據寫入到hdfs文件系統的的/hadoop/test/2.txt中。
    實現步驟:
    1、拖入以下組件
    在這裏插入圖片描述
    2、配置 JSON 輸入組件
    在這裏插入圖片描述
    3、配置Hadoop file output組件
    在這裏插入圖片描述
  • 問題
    在這裏插入圖片描述
    錯誤:admin用戶沒有權限
    解決:

#添加用戶
hadoop fs -mkdir /user/admin
權限分配
hadoop fs -chown admin:hdfs /user/admin
#修改權限
sudo -u hdfs hadoop fs -chmod -R 777 /

Kettle整合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;

kettle與Hive整合

1、從虛擬機下載Hadoop的jar包

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,重新加載生效

從hive中讀取數據

  • hive數據庫是通過jdbc來進行連接,可以通過表輸入控件來獲取數據。
    需求:
  • 從hive數據庫的test庫的a表中獲取數據,並把數據保存到Excel中。
    實現步驟:
    1、設計一下kettle組件結構
    在這裏插入圖片描述
    2、配置表輸入組件

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
##把數據保存到hive數據庫
hive數據庫是通過jdbc來進行連接,可以通過表輸出控件來保存數據。
需求:

  • 從Excel中讀取數據,把數據保存在hive數據庫的test數據庫的a表。
    實現步驟:
    1、設計如下kettle組件結構
    在這裏插入圖片描述
    2、配置 Excel輸入組件
    在這裏插入圖片描述
    在這裏插入圖片描述
    2、配置表輸出組件
    在這裏插入圖片描述
    在這裏插入圖片描述
    驗證
    在這裏插入圖片描述
    執行Hive的HiveSQL語句
    Kettle中可以執行Hive的HiveSQL語句,使用作業的SQL腳本。
    需求:
  • 聚合查詢a表表中a字段大於1的數據,同時建立一個新表new_a保存查詢數據。
    實現步驟:
    1、設計如下作業組件結構
    在這裏插入圖片描述
    2、配置SQL組件
    3、測試數據是否生成

Kettle轉換組件

  • 轉換是ETL的T,T就是Transform清洗、轉換
  • ETL三個部分中,T花費時間最長,是“一般情況下這部分工作量是整個ETL的2/3
    在這裏插入圖片描述

值映射

  • 值映射就是把字段的一個值映射成其他的值
  • 在數據質量規範上使用非常多,比如很多系統對應性別gender字段的定義不同
    • 系統1:1 男、2女
    • 系統2:f 男、m 女
    • 數據倉庫統一爲:male 男、female女
      需求:
  • 從user.json 中讀取數據,並把gender列
    • 0 -> 男
    • 1 -> 女
    • 2 -> 保密
  • 寫入到Excel文件
    實現步驟:
    1、拖入一個 JSON輸入組件、一個值映射轉換組件、一個Excel輸出組件,連接三個組件
    2、配置JSON輸入組件
    3、配置值映射轉換組件
    4、配置Excel輸出組件
    具體實現:
    1、拖入一個 JSON輸入組件、一個值映射轉換組件、一個Excel輸出組件,連接三個組件
    在這裏插入圖片描述
    2、配置JSON輸入組件
    3、配置值映射轉換組件
    在這裏插入圖片描述
    4、配置Excel輸出組件

增加序列

  • 增加序列就是給數據流增加一個序列字段
    在這裏插入圖片描述
    需求:
  • 從 user.json 讀取數據,並添加序列,把數據保存到Excel
    實現步驟:
    1、拖入JSON輸入組件、增加序列組件、Excel輸出組件,並連接三個組件
    在這裏插入圖片描述
    2、配置JSON Input組件
    3、配置增加序列組件
    在這裏插入圖片描述
    4、配置Excel輸出組件

字段選擇

  • 字段選擇是從數據流中選擇字段、改變名稱、修改數據類型
    需求:
  • 從 user.json 中讀取數據
  • 移除birthday和register_date
  • 把phone列名改爲telephone,id列名改爲key,gender列名改爲sex
  • 輸出到Excel文件中
    實現步驟:
    1、拖入 JSON輸入 組件、字段選擇組件、Excel輸出組件
    在這裏插入圖片描述
    2、配置輸入、字段選擇、輸出組件
    在這裏插入圖片描述

Kettle流程控件

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

switch case

  • switch/case組件讓數據流從一路到多路。
    在這裏插入圖片描述
    需求:
  • 從 user.json 輸入讀取數據,按sex進行數據分類,把女性、男性、保密分別保存不同的Excel文件裏面。
    • 0表示男性
    • 1表示女性
    • 2表示保密
      實現步驟:
      1、拖入 JSON輸入組件,switch/case組件,三個Excel輸出組件

在這裏插入圖片描述
2、配置 switch/case 組件
在這裏插入圖片描述

過濾記錄

過濾記錄讓數據流從一路到兩路。
在這裏插入圖片描述
需求- 從 user.json 讀取數據,分離出 年齡 大於等於25,小於25的數據,分別保存到不同的Excel文件
實現步驟:
1、拖入 JSON輸入組件、過濾記錄組件、兩個Excel組件,並連接各個組件
在這裏插入圖片描述
2、配置過濾記錄組在這裏插入圖片描述
Kettele連接控件
在這裏插入圖片描述
需求:

  • 從Excel讀取兩位和三位數,完成兩位數和三位數的組合(笛卡爾積),把結果保存在Excel
    實現步驟:
    1、設計轉換結構
    在這裏插入圖片描述
    2、配置記錄關聯(笛卡爾積組件)【不要任何設置】
    在這裏插入圖片描述

記錄集連接

  • 記錄集連接類似數據庫的左連接、右連接、內連接、外連接。
  • 在進行記錄集連接之前,應該要對記錄集進行排序
    實現步驟:
    1、設計以下組件圖
    在這裏插入圖片描述

Kettle Javascript腳本組件/

  • Kettle中可以通過腳本完成一些複雜的操作
  • javascript腳本就是使用javascript語言通過代碼編程來完成對數據流的操作
  • JS中有很多內置函數,可以在編寫JS代碼時查看
  • 存在兩種不同的模式不兼容模式和兼容模式
    • 不兼容模式:是默認的,也是推薦的
    • 兼容模式:兼容老版本的kettle
      對比不兼容模式與兼容模式的差別:
      在這裏插入圖片描述
      編寫以上JS代碼的思路
      第一步
      使用java開發項目需求的代碼,並能夠正常運行。
public class newDatae {
    public static void main(String[] args) throws ParseException {

        //生成2000-01-01的日期和2000-01-02的日期數據
        //2000-01-02的需要是2000-01-01 + 1成的


        //初始數據是2000-01-01
        String initDataeS="2000-01-01";
        //變量N 天(編號)
        int add=10;

        //設置日期的格式
        SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd");
        //將String 的日期轉爲date
         Date initdateD = simpleDateFormat.parse(initDataeS);

        //創建一個日曆的對象
        Calendar calendar=Calendar.getInstance();
        //設置日曆的初始值   原始值01-01
        calendar.setTime(initdateD);

        // 輸出日期數據2000-01-01  2000-01-02
        System.out.println(simpleDateFormat.format(calendar.getTime()));

        //原始值01-01+1=>01-02
        calendar.add(Calendar.DAY_OF_MONTH,add);

        System.out.println(simpleDateFormat.format(calendar.getTime()));



    }

}

第二步
將java 代碼中的所有的變量聲明前面的類型,換成var

        //生成2000-01-01的日期和2000-01-02的日期數據
        //2000-01-02的需要是2000-01-01 + 1成的
        
        //初始數據是2000-01-01
        var initDataeS="2000-01-01";
        //變量N 天(編號)
        var add=10;

        //設置日期的格式
        var simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd");
        //將String 的日期轉爲date
        var initdateD = simpleDateFormat.parse(initDataeS);

        //創建一個日曆的對象
        var calendar=Calendar.getInstance();
        //設置日曆的初始值   原始值01-01
        calendar.setTime(initdateD);

        // 輸出日期數據2000-01-01  2000-01-02
        System.out.println(simpleDateFormat.format(calendar.getTime()));

        //原始值01-01+1=>01-02
        calendar.add(Calendar.DAY_OF_MONTH,add);

        System.out.println(simpleDateFormat.format(calendar.getTime()));

代碼中的對象使用詳細包名類名

        //初始數據是2000-01-01
        var initDataeS="2000-01-01";
        //變量N 天(編號)
        var add=10;

        //設置日期的格式
        var simpleDateFormat= java.text.SimpleDateFormat("yyyy-MM-dd");
        //將String 的日期轉爲date
        var initdateD = simpleDateFormat.parse(initDataeS);

        //創建一個日曆的對象
        var calendar=java.util.Calendar.getInstance();
        //設置日曆的初始值   原始值01-01
        calendar.setTime(initdateD);

        // 輸出日期數據2000-01-01  2000-01-02
       // System.out.println(simpleDateFormat.format(calendar.getTime()));

        //原始值01-01+1=>01-02
        calendar.add(java.util.Calendar.DAY_OF_MONTH,add);

結果
在這裏插入圖片描述
Kettle作業和參數
Job Item(作業項)
作業項是作業的基本構成部分。如同轉換的組件,作業項也可以用圖標的方式展示。
在這裏插入圖片描述
作業順序執行作業項,必須定義一個起點
Job Item(作業項)
Job Hop是作業項之間的連接線,定義了作業的執行路徑,作業裏每個作業項的不同運行結果決定了作業的不同執行路徑
在這裏插入圖片描述

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