赞
踩
大家好,欢迎来到本篇博客,博主是一名刚入大数据行业的小白,利用空闲的时间来分享自己所学的知识,帮助和博主一样刚处于起步阶段的同学,水平不高,若有什么错误和纰漏之处恳请大佬不吝赐教,目前个人博客只有CSDN:
https://zhenyu.blog.csdn.net/
,感谢大家的支持,谢谢
送给大家一句话:今日事,今日毕本篇博客主要讲解:使用KETTLE实现法定国家日
目标:
- 能够使用kettle生成日期维度数据
需求:
年月日
当年的第几天
当月的第几天
是否是月的第一天
是否十月的最后一天
星期
月的第几个星期
是否是周一
是否是休息日
是否是工作日
是否是国家法定节假日
日期类型 工作日:workday,国家法定节假日:holiday,休息日:weekend
月份
年份
季度名称
季度
年-季度
年-月份
名 | 类型 | 示例值 | 中文名 |
---|---|---|---|
date_key | string | 20000101 | 代理键 |
date_value | string | 2000-01-01 | 年-月-日 |
day_in_year | string | 1 | 当年的第几天 |
day_in_month | string | 1 | 当月的第几天 |
is_first_day_in_month | string | y | 是否月的第一天 |
is_last_day_in_month | string | n | 是否月的最后一天 |
weekday | string | 星期一 | 星期 |
week_in_month | string | 1 | 月的第几个星期 |
is_first_day_in_week | string | y、n | 是否周一 |
is_dayoff | string | y、n | 是否休息日 |
is_workday | string | y、n | 是否工作日 |
is_holiday | string | y、n | 是否国家法定节假日 |
date_type | string | workday、weekend、holiday 工作日、周末、法定节假日 | 日期类型 工作日:workday 国家法定节假日:holiday 休息日:weekend |
month_number | string | 1、2、…、12 | 月份 |
year | string | 2000 | 年份 |
quarter_name | string | Q1 | 季度名称 |
quarter_number | string | 1 | 季度 |
year_quarter | string | 2000-Q1 | 年-季度 |
year_month_number | string | 2000-01 | 年-月份 |
大家看到这次需求是不是惊呆了这个该怎么实现,你这操作把我整神
家人们不要慌,坐下来仔细思考,博主带你一起学习如何操作
------
Kettle实现思路:
1、接口地址:http://timor.tech/api/holiday/info/数字日期,支持https协议。 2、返回数据:正常工作日对应结果为 0,,休息日对应结果为 1, 法定节假日对应结果为 2 3、节假日数据说明:本接口包含2017年起的中国法定节假日数据,数据来源国务院发布的公告,每年更新1次,确保数据最新 4、示例: http://timor.tech/api/holiday/info/2020-10-01 返回数据: {"code":0,"type":{"type":0,"name":"周五","week":5},"holiday":null} { "code": 0, // 0服务正常。-1服务出错 "type": { "type": enum(0, 1, 2), // 节假日类型,分别表示 工作日、周末、节日。 "name": "周六", // 节假日类型中文名,可能值为 周一 至 周日、假期的名字、某某调休。 "week": enum(1 - 7) // 一周中的第几天。值为 1 - 7,分别表示 周一 至 周日。 }, "holiday": { "holiday": false, // true表示是节假日,false表示是调休 "name": "国庆前调休", // 节假日的中文名。如果是调休,则是调休的中文名,例如'国庆前调休' "wage": 1, // 薪资倍数,1表示是1倍工资 "after": false, // 只在调休下有该字段。true表示放完假后调休,false表示先调休再放假 "target": '国庆节' // 只在调休下有该字段。表示调休的节假日 } }
参考数据:
dim_date.date_value | dim_date.day_in_month | dim_date.is_first_day_in_month | dim_date.is_last_day_in_month | dim_date.weekday | dim_date.week_in_month | dim_date.is_first_day_in_week | dim_date.is_dayoff | dim_date.is_workday | dim_date.is_holiday | dim_date.date_type | dim_date.month_number | dim_date.year | dim_date.year_month_number | dim_date.quarter_name | dim_date.quarter_number | dim_date.year_quarter |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2019-1-1 | 1 | y | n | 2 | 1 | n | n | n | y | holiday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-3 | 3 | n | n | 4 | 1 | n | n | y | n | workday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-4 | 4 | n | n | 5 | 1 | n | n | y | n | workday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-5 | 5 | n | n | 6 | 1 | n | y | n | n | weekend | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-2 | 2 | n | n | 3 | 1 | n | n | y | n | workday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-6 | 6 | n | n | 7 | 2 | n | y | n | n | weekend | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-7 | 7 | n | n | 1 | 2 | y | n | y | n | workday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-8 | 8 | n | n | 2 | 2 | n | n | y | n | workday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-9 | 9 | n | n | 3 | 2 | n | n | y | n | workday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
2019-1-10 | 10 | n | n | 4 | 2 | n | n | y | n | workday | 1 | 2019 | Jan-19 | Q1 | 1 | 2019-Q1 |
生成记录组件
注:为什么要限制365呢?因为一年有365天呀!总不能让他一刀999999一直生成记录
增加序列
为什么要使用增加序列呢?因为一年的时间是从1开始到365结束的,生成记录运行了365次,每运行一次序列就会累加一次
因为后面我们会使用到JavaScript代码,在代码中我们会初始化一个时间,然后在利用上面增加序列变量setup
外部参数,对时间进行累加,这样每次就可以得到不同的时间了
JavaScript组件,生成基本时间维度数据
//初始日期 var initStr = "2020-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, setup); //获取增加一天之后的日期 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 var 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组件
配置JSON Input组件
配置 switch/case 组件
配置工作日、法定节假日、休息日等组件
配置字段选择组件
配置Excel
查看结果
感谢大家的支持,若有什么不正确的地方还请大家能及时的反馈,记得点赞收藏支持一下!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。