做问卷用哪个网站/深圳竞价托管
使用Kettle生成日期维度数据
需求:
- 为了后续分析销售订单金额、订单笔数的周环比、周同比、月环比、月同比,需要提前使用Kettle生成时间维度工具(环比是相邻比较,同比是历史同期比较)
- 按照以下字段生成 2019年一年的日期维度数据
分析: - 日期使用 Canlendar、SimpleDateFormat,编写Javascript脚本实现
- 国家法定节假日实现,需要往http://api.goseek.cn/Tools/holiday?date=20190102 年月日,发送请求,获取结果,以下为该REST API接口简介
1、接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期,支持https协议。 2、返回数据:正常工作日对应结果为 0,,休息日对应结果为 1, 法定节假日对应结果为 2 3、节假日数据说明:本接口包含2017年起的中国法定节假日数据,数据来源国务院发布的公告,每年更新1次,确保数据 最新4、示例: http://timor.tech/api/holiday/info/2018-03-02 返回数据: {“code”:0,“type”:{“type”:0,“name”:“周五”,“week”:5},“holiday”:null} { “code”: 0, // 0服务正常。-1服务出错 “type”: { “type”: enum(0, 1, 2,3), // 节假日类型,分别表示 工作日、周末、节日、调休。 “name”: “周六”, // 节假日类型中文名,可能值为 周一 至 周日、假期的名字、某某调休。 “week”: enum(1 - 7) // 一周中的第几天。值为 1 - 7,分别表示 周一 至 周日。 },“holiday”: { “holiday”: false, // true表示是节假日,false表示是调休 “name”: “国庆前调休”, // 节假日的中文名。如果是调休,则是调休的中文名,例如’国庆前调休’ “wage”: 1, // 薪资倍数,1表示是1倍工资 “after”: false, // 只在调休下有该字段。true表示放完假后调休,false表示先调休再放假 “target”: ‘国庆节’ // 只在调休下有该字段。表示调休的节假日 } }
增加序列
Javascript代码
Http Client组件(5个并行度)
JSON Input
Switch/case
字段映射为常量
工作日
法定节假日
节假日调休补班
休息日
字段选择
Hadoop File Output
组件配置
1、生成记录组件
配置限制为 365
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, 1);//获取增加一天之后的日期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,星期六是7if(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";//定义查询的urlvar holidayUrl = "http://timor.tech/api/holiday/info/" + 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
test
.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)
STORED AS PARQUET;