【Kettle】 Javascript脚本组件

  • 介绍

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中

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