大家好,欢迎来到本篇博客,博主是一名刚入大数据行业的小白,利用空闲的时间来分享自己所学的知识,帮助和博主一样刚处于起步阶段的同学,水平不高,若有什么错误和纰漏之处恳请大佬不吝赐教,目前个人博客只有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

组件配置

  1. 生成记录组件
    注:为什么要限制365呢?因为一年有365天呀!总不能让他一刀999999一直生成记录

  2. 增加序列

    为什么要使用增加序列呢?因为一年的时间是从1开始到365结束的,生成记录运行了365次,每运行一次序列就会累加一次

    因为后面我们会使用到JavaScript代码,在代码中我们会初始化一个时间,然后在利用上面增加序列变量setup外部参数,对时间进行累加,这样每次就可以得到不同的时间了

  3. 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组件

  1. 配置JSON Input组件

  2. 配置 switch/case 组件

  3. 配置工作日、法定节假日、休息日等组件

  4. 配置字段选择组件

  5. 配置Excel

  6. 查看结果

    感谢大家的支持,若有什么不正确的地方还请大家能及时的反馈,记得点赞收藏支持一下!

如何使用KETTLE实现国定法定节假日?相关推荐

  1. java万年历计算法定节假日,java获取中国节假日

    引入fastjson和hutool com.alibaba fastjson 1.2.75 cn.hutool hutool-all 5.3.0 返回1代表正常休息日,2代表国家法定节假日 impor ...

  2. php根据当前日期判断法定节假日_判断日期是否为法定节假日的API接口与示例函数...

    需要判定某日期是否为法定节假日,由于国家的节假日每年都在变动,所以使用接口判定是必要的.可惜的是,这样的接口并不多,在此汇总三个: 前两个看起来是个人的,最后一个是聚合数据的万年历接口. 请注意,本文 ...

  3. 法定节假日违规组织培训,51talk被通报批评整改不到位

    9月23日消息,北京市教委发布<北京市教育委员会关于检查线上学科类培训机构发现问题的通报>(以下简称:通报)点名批评51talk(无忧英语)违规问题突出. 通报称,51talk(无忧英语) ...

  4. 大数据基础数据之中国法定节假日API

    中国法定节假日API Date: November 16, 2021 1.背景 目前业务需求中,需要分析法定节假日.我们日常查看法定节假日,都是在百度或者某些日历中查看.但是,网上很少有通过API获得 ...

  5. Python3 获取法定节假日

    站在巨人的肩膀上. 想要获取法定节假日时,找到了这位大佬的博客. https://blog.csdn.net/joson1234567890/article/details/106214810 但是问 ...

  6. java节假日算法_「国家法定节假日」java 国家法定节假日和双休日判断工具类 - seo实验室...

    国家法定节假日 package com.newland.dateutil; import java.text.ParseException; import java.text.simpledatefo ...

  7. java 法定节假日_【java】如何获得每年的法定节假日期以及全年的日历

    每年的节假日都在变动,如果人工录入会比较麻烦.有相关方面的接口可以调用吗? 回答 谢谢上面的同学热心帮助,我挨个试过去 还是用easybots来实现比较符合项目要求 通过把12个月份传进去 来获取整年 ...

  8. 判断当前时间是否是法定节假日或工作日

    判断当前时间是否是法定节假日或工作日 一.介绍 二.实现 一.介绍 采用语言: Java 基于内网下采取配置文件的方式, 来判断当前是否是节假日(包括周末和调休上班日) 如果基于外网取请见 这里 工具 ...

  9. php实现爬虫抓取法定节假日放假和补班安排数据

    今天闲聊群有朋友问我怎么判断今天是不是法定节假日,是上班还是放假还是假期补班,想了想应该有相应的api,直接去调用就行了,但也可以去国务院官网发的放假通知上面去抓取,今天就跟大家分享下php实现爬虫抓 ...

  10. java 跳过法定节假日和双休

    注意:五一假期的5天规则还需要算一下.直接拿过去即可使用 import java.text.ParseException; import java.text.SimpleDateFormat; imp ...

最新文章

  1. Chrome反压缩JS代码:Pretty Print显示可读代码
  2. 【渝粤教育】国家开放大学2018年春季 0184-21T行政职业能力 参考试题
  3. 2017软件工程实践
  4. 科研福利!北京超算获通用CPU算力第一,2000核时免费领取
  5. Java 反射(Array相关)
  6. php实验cookie,PHP实验一、二(cookie和session)
  7. Java ---学习笔记(泛型)
  8. 784. 字母大小写全排列
  9. C++如何防止头文件被二次编译
  10. pod BaiduMapKit 报错解决方案
  11. Windows(11)下JDK安装与环境变量配置
  12. 想在Win11上安装数据库?以下连招,轻松解决(全网详细巨无霸)
  13. 读写锁就是恶霸和良民一起桑拿
  14. 2021 年最佳 3D 渲染 GPU
  15. The remote end hung up unexpectedly The remote end hung up unexpectedly RPC failed;
  16. IOS中通过快捷捷径打开场所码或者健康码
  17. 福布斯:区块链科技从边缘到主流的…
  18. 【刷题笔记4】木棍组成三角形问题(斐波那契数列)
  19. 王者荣耀英雄的原型故事
  20. 【雷达图像】SAR合成孔径雷达成像及处理【含Matlab源码 307期】

热门文章

  1. lpush rpush 区别_关于redis之lpush、rpush、lset、lrem
  2. 《老路用得上的商学课16—20》消费心理学(一)
  3. python如何安装pdfminer_为什么PIP安装不能为PDFMiner工作?
  4. 如何在excel中挑选出奇数行和偶数行
  5. php生成五星红旗,php基于GD库画五星红旗的方法_PHP
  6. 【人工智能】归结演绎推理
  7. 用python判断素数_python判断素数
  8. matlab中变量的命名规则
  9. 【Python】UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe
  10. webstorm搜狗输入法变成繁体字