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语句中使用 ${变量名} 或者%%变量名%% 直接引用

 

 

 

 

谢谢你长得这么好看还给我点赞

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