- 介紹
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中