当前位置:   article > 正文

如何使用KETTLE实现国定法定节假日?_kettle中获取节假日

kettle中获取节假日

大家好,欢迎来到本篇博客,博主是一名刚入大数据行业的小白,利用空闲的时间来分享自己所学的知识,帮助和博主一样刚处于起步阶段的同学,水平不高,若有什么错误和纰漏之处恳请大佬不吝赐教,目前个人博客只有CSDN:https://zhenyu.blog.csdn.net/,感谢大家的支持,谢谢
送给大家一句话:今日事,今日毕

本篇博客主要讲解:使用KETTLE实现法定国家日

目标:

  • 能够使用kettle生成日期维度数据

生成日期维度数据

需求:

  • 使用Kettle生成2020年所有的的日期数据
  • 要包含一下条件:
    • 年月日 当年的第几天 当月的第几天 是否是月的第一天 是否十月的最后一天
    • 星期 月的第几个星期 是否是周一 是否是休息日 是否是工作日 是否是国家法定节假日
    • 日期类型 工作日:workday,国家法定节假日:holiday,休息日:weekend 月份 年份
    • 季度名称 季度 年-季度 年-月份
  • 如下面列表所示:
类型示例值中文名
date_keystring20000101代理键
date_valuestring2000-01-01年-月-日
day_in_yearstring1当年的第几天
day_in_monthstring1当月的第几天
is_first_day_in_monthstringy是否月的第一天
is_last_day_in_monthstringn是否月的最后一天
weekdaystring星期一星期
week_in_monthstring1月的第几个星期
is_first_day_in_weekstringy、n是否周一
is_dayoffstringy、n是否休息日
is_workdaystringy、n是否工作日
is_holidaystringy、n是否国家法定节假日
date_typestringworkday、weekend、holiday
工作日、周末、法定节假日
日期类型
工作日:workday
国家法定节假日:holiday

休息日:weekend
month_numberstring1、2、…、12月份
yearstring2000年份
quarter_namestringQ1季度名称
quarter_numberstring1季度
year_quarterstring2000-Q1年-季度
year_month_numberstring2000-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": '国庆节'     // 只在调休下有该字段。表示调休的节假日
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

参考数据:

dim_date.date_valuedim_date.day_in_monthdim_date.is_first_day_in_monthdim_date.is_last_day_in_monthdim_date.weekdaydim_date.week_in_monthdim_date.is_first_day_in_weekdim_date.is_dayoffdim_date.is_workdaydim_date.is_holidaydim_date.date_typedim_date.month_numberdim_date.yeardim_date.year_month_numberdim_date.quarter_namedim_date.quarter_numberdim_date.year_quarter
2019-1-11yn21nnnyholiday12019Jan-19Q112019-Q1
2019-1-33nn41nnynworkday12019Jan-19Q112019-Q1
2019-1-44nn51nnynworkday12019Jan-19Q112019-Q1
2019-1-55nn61nynnweekend12019Jan-19Q112019-Q1
2019-1-22nn31nnynworkday12019Jan-19Q112019-Q1
2019-1-66nn72nynnweekend12019Jan-19Q112019-Q1
2019-1-77nn12ynynworkday12019Jan-19Q112019-Q1
2019-1-88nn22nnynworkday12019Jan-19Q112019-Q1
2019-1-99nn32nnynworkday12019Jan-19Q112019-Q1
2019-1-1010nn42nnynworkday12019Jan-19Q112019-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,星期六是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;

        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101

在这里插入图片描述
4. 配置HttpClient组件
在这里插入图片描述

  1. 配置JSON Input组件
    在这里插入图片描述
    在这里插入图片描述

  2. 配置 switch/case 组件
    在这里插入图片描述

  3. 配置工作日、法定节假日、休息日等组件
    在这里插入图片描述

  4. 配置字段选择组件
    在这里插入图片描述

  5. 配置Excel
    在这里插入图片描述

  6. 查看结果
    在这里插入图片描述
    感谢大家的支持,若有什么不正确的地方还请大家能及时的反馈,记得点赞收藏支持一下!在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/675591
推荐阅读
相关标签
  

闽ICP备14008679号