目录
1、打开plugins\pentaho-big-data-plugin\plugin.properties 文件
21、Test21 JS脚本(使用Kettle生成日期维度数据)
一、Kettle安装、配置
环境要求:
- 安装、配置好JDK
1、下载Kettle
2、解压Kettle
3、双击spoon.bat 启动spoon
4、操作和mysql相关的的需要在lib目录下导入mysql驱动包
二、Kettle的使用(输入输出组件)
Kettle数据流结构图
1、Test1 csv-excel
- 在Kettle中新建转换
- 拖拽一个CSV输入组件、一个Excel输出组件、并按住Shift拖动鼠标连接两个组件
- 配置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
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目录下
11、Test11 hive- –excel
hive 数据库是通过 jdbc 来进行连接,可以通过表输入控件来获取数据
准备大数据Hive环境,创建数据表。
准备数据,将数据加载到hive
hive --service hiveserver2 &
hive --service metastore &
1、连接hive
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、创建数据文件
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 中可以执行 Hive 的 HiveSQL 语句,使用作业的 SQL 脚本。
五、Kettle转换组件
转换是 ETL 的 T , T 就是 Transform清洗、转换 ETL三个部分中, T 花费时间最 长, 是 “ 一般情况下这部分工作 量是整个ETL 的 2/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代码时查看
- 存在两种不同的模式不兼容模式和兼容模式
-
不兼容模式:是默认的,也是推荐的
-
兼容模式:兼容老版本的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生成日期维度数据)
需求:
名 | 类型 | 示例值 | 中文名 |
---|---|---|---|
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(作业)
- 如何传送文件
- 验证数据库表是否存在,等等
Job Item(作业项)
作业项是作业的基本构成部分。如同转换的组件,作业项也可以用图标的方式展示。
- 作业顺序执行作业项,必须定义一个起点
- 有一个「start」的作业项专门用来定义起点
- 一个作业只能定一个开始作业项
Job Hop(作业跳)
- 不论上一个作业项执行成功还是失败,下一个作业项都会执行
- 蓝色的连接线,上面有一个锁的图标
- 当上一个作业项的执行结果为真时,执行下一个作业项
- 通常在需要无错误执行的情况下使用
- 绿色的连接线,上面有一个对钩号的图标。
- 当上一个作业项的执行结果为假或者没有成功执行时,执行下一个作业项
- 红色的连接线,上面有一个红色的停止图标
- 在图标上单击就可以对Hop进行设置
22、Test22
参数
23、Test23-表输入参数传递 - 转换命名参数