- 介绍
1.Kettle中可以通过脚本完成一些复杂的操作
2.javascript脚本就是使用javascript语言通过代码编程来完成对数据流的操作
3.JS中有很多内置函数,可以在编写JS代码时查看,存在两种不同的模式不兼容模式和兼容模式 不兼容模式:是默认的,也是推荐的 兼容模式:兼容老版本的kettle
对比不兼容模式与兼容模式的差别:
- 实操
需求:
生成日期维度数据日期,年,月,日,从2000年01月01日开始有1000条记录,保存到Excel
拖入一个生成记录输入组件、一个增加序列组件、一个JavaScript脚本组件、一个Excel输出组件,并连接各个组件
配置生成记录输入组件
配置增加序列组件
配置JavaScript脚本组件
编写JavaScript代码
//生成日期维度数据日期,年,月,日,从2000年01月01日开始有1000条记录
//初始值
var dateStr = "2000-01-01";
//增加的天数
var addDate = lineNumber;
//创建日期对象
var simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");
//将日期字符串转为Date
var parse = simpleDateFormat.parse(dateStr);
//创建日历对象
var instance = java.util.Calendar.getInstance();
instance.setTime(parse);
//日期增长
instance.add(instance.DAY_OF_MONTH,addDate);
//最终结果
var newDateStr = simpleDateFormat.format(instance.getTime())
配置Excel输出组件
点击三角形箭头执行
- 处理复杂日期数据
需求:
把日期数据处理成如下图的数据,生成2019年全年数据
流程图
生成记录
生成365条数据
增加序列
设置增长量
JavaScript代码
书写js代码处理业务需求
//初始日期
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, valuename);
//获取增加一天之后的日期
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
//接口地址为 http://api.tianapi.com 需要自己注册账号
var holidayUrl = "http://api.tianapi.com/txapi/jiejiari/index?key=1bd61c24f344b2f616d0c5b4e781fdd9&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;
}
HTTP client
发送http请求根据之前定义的地址获取数据
JSON input
获取请求中需要的数据
请求的数据JSON格式为
获取指定字段数据
Switch / case
根据获取字段不同的值进行不同的逻辑处理
进行逻辑处理
字段选择
选择需要的字段,移除不需要的字段
Parquet output
使用Parquet格式讲数据写入到hdfs中