【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中

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