如何使用KETTLE实现国定法定节假日?
大家好,欢迎来到本篇博客,博主是一名刚入大数据行业的小白,利用空闲的时间来分享自己所学的知识,帮助和博主一样刚处于起步阶段的同学,水平不高,若有什么错误和纰漏之处恳请大佬不吝赐教,目前个人博客只有CSDN:
https://zhenyu.blog.csdn.net/
,感谢大家的支持,谢谢
送给大家一句话:今日事,今日毕本篇博客主要讲解:使用KETTLE实现法定国家日
目标:
- 能够使用kettle生成日期维度数据
法定节假日
- 生成日期维度数据
- 使用Kettle构建以下组件结构图
- 组件配置
生成日期维度数据
需求:
- 使用Kettle生成2020年所有的的日期数据
- 要包含一下条件:
年月日
当年的第几天
当月的第几天
是否是月的第一天
是否十月的最后一天
星期
月的第几个星期
是否是周一
是否是休息日
是否是工作日
是否是国家法定节假日
日期类型 工作日: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 | 年-月份 |
- 将以上需求导入Excel
大家看到这次需求是不是惊呆了这个该怎么实现,你这操作把我整神
家人们不要慌,坐下来仔细思考,博主带你一起学习如何操作
------
Kettle实现思路:
- 日期使用 Canlendar、SimpleDateFormat,编写Javascript脚本实现
- 国家法定节假日实现,需要往http://timor.tech/api/holiday/info/2018-03-02年月日,发送请求,获取结果,以下为该REST API接口简介
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 |
使用Kettle构建以下组件结构图
- 生成记录
- 增加序列
- Javascript代码
- Http Client组件(5个并行度)
- JSON Input
- Switch/case
- 字段映射为常量
- 工作日
- 法定节假日
- 节假日调休补班
- 休息日
- 字段选择
- Excel
组件配置
生成记录组件
注:为什么要限制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,星期六是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组件
配置JSON Input组件
配置 switch/case 组件
配置工作日、法定节假日、休息日等组件
配置字段选择组件
配置Excel
查看结果
感谢大家的支持,若有什么不正确的地方还请大家能及时的反馈,记得点赞收藏支持一下!
如何使用KETTLE实现国定法定节假日?相关推荐
- java万年历计算法定节假日,java获取中国节假日
引入fastjson和hutool com.alibaba fastjson 1.2.75 cn.hutool hutool-all 5.3.0 返回1代表正常休息日,2代表国家法定节假日 impor ...
- php根据当前日期判断法定节假日_判断日期是否为法定节假日的API接口与示例函数...
需要判定某日期是否为法定节假日,由于国家的节假日每年都在变动,所以使用接口判定是必要的.可惜的是,这样的接口并不多,在此汇总三个: 前两个看起来是个人的,最后一个是聚合数据的万年历接口. 请注意,本文 ...
- 法定节假日违规组织培训,51talk被通报批评整改不到位
9月23日消息,北京市教委发布<北京市教育委员会关于检查线上学科类培训机构发现问题的通报>(以下简称:通报)点名批评51talk(无忧英语)违规问题突出. 通报称,51talk(无忧英语) ...
- 大数据基础数据之中国法定节假日API
中国法定节假日API Date: November 16, 2021 1.背景 目前业务需求中,需要分析法定节假日.我们日常查看法定节假日,都是在百度或者某些日历中查看.但是,网上很少有通过API获得 ...
- Python3 获取法定节假日
站在巨人的肩膀上. 想要获取法定节假日时,找到了这位大佬的博客. https://blog.csdn.net/joson1234567890/article/details/106214810 但是问 ...
- java节假日算法_「国家法定节假日」java 国家法定节假日和双休日判断工具类 - seo实验室...
国家法定节假日 package com.newland.dateutil; import java.text.ParseException; import java.text.simpledatefo ...
- java 法定节假日_【java】如何获得每年的法定节假日期以及全年的日历
每年的节假日都在变动,如果人工录入会比较麻烦.有相关方面的接口可以调用吗? 回答 谢谢上面的同学热心帮助,我挨个试过去 还是用easybots来实现比较符合项目要求 通过把12个月份传进去 来获取整年 ...
- 判断当前时间是否是法定节假日或工作日
判断当前时间是否是法定节假日或工作日 一.介绍 二.实现 一.介绍 采用语言: Java 基于内网下采取配置文件的方式, 来判断当前是否是节假日(包括周末和调休上班日) 如果基于外网取请见 这里 工具 ...
- php实现爬虫抓取法定节假日放假和补班安排数据
今天闲聊群有朋友问我怎么判断今天是不是法定节假日,是上班还是放假还是假期补班,想了想应该有相应的api,直接去调用就行了,但也可以去国务院官网发的放假通知上面去抓取,今天就跟大家分享下php实现爬虫抓 ...
- java 跳过法定节假日和双休
注意:五一假期的5天规则还需要算一下.直接拿过去即可使用 import java.text.ParseException; import java.text.SimpleDateFormat; imp ...
最新文章
- Chrome反压缩JS代码:Pretty Print显示可读代码
- 【渝粤教育】国家开放大学2018年春季 0184-21T行政职业能力 参考试题
- 2017软件工程实践
- 科研福利!北京超算获通用CPU算力第一,2000核时免费领取
- Java 反射(Array相关)
- php实验cookie,PHP实验一、二(cookie和session)
- Java ---学习笔记(泛型)
- 784. 字母大小写全排列
- C++如何防止头文件被二次编译
- pod BaiduMapKit 报错解决方案
- Windows(11)下JDK安装与环境变量配置
- 想在Win11上安装数据库?以下连招,轻松解决(全网详细巨无霸)
- 读写锁就是恶霸和良民一起桑拿
- 2021 年最佳 3D 渲染 GPU
- The remote end hung up unexpectedly The remote end hung up unexpectedly RPC failed;
- IOS中通过快捷捷径打开场所码或者健康码
- 福布斯:区块链科技从边缘到主流的…
- 【刷题笔记4】木棍组成三角形问题(斐波那契数列)
- 王者荣耀英雄的原型故事
- 【雷达图像】SAR合成孔径雷达成像及处理【含Matlab源码 307期】
热门文章
- lpush rpush 区别_关于redis之lpush、rpush、lset、lrem
- 《老路用得上的商学课16—20》消费心理学(一)
- python如何安装pdfminer_为什么PIP安装不能为PDFMiner工作?
- 如何在excel中挑选出奇数行和偶数行
- php生成五星红旗,php基于GD库画五星红旗的方法_PHP
- 【人工智能】归结演绎推理
- 用python判断素数_python判断素数
- matlab中变量的命名规则
- 【Python】UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe
- webstorm搜狗输入法变成繁体字