kettle生成节假日数据原来还可以这样操作?

前言

         最近有好多小伙伴私信我,遇到一个问题在做数仓项目中遇到了瓶颈有的需求需要根据节假日去统计信息。但是由于节假日每年都不一样目前提供的方法没法动态的去获取关于节假日的信息。所以自己去编写一个实现类就完成这个操作。

在这里插入图片描述

一、需求描述

         在Hive中生成一个表用来保存关于日期的工具。目前大公司为了提高效率。创建一个日期表 将需要的数据保存到日期表中,使用的时候只需要join下即可实现次功能。

类型示例值中文名
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年-月份

预期结果数据

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
202001132020-01-13202013nn13ynynworkday0120202020-01Q1
202001122020-01-12202012nn73nnynweekend0120202020-01Q1
202001112020-01-11202011nn62nnynweekend0120202020-01Q1
202001102020-01-10202010nn52nnynworkday0120202020-01Q1
202001092020-01-0920209nn42nnynworkday0120202020-01Q1
202001082020-01-0820208nn32nnynworkday0120202020-01Q1
202001072020-01-0720207nn22nnynworkday0120202020-01Q1
202001062020-01-0620206nn12ynynworkday0120202020-01Q1
202001052020-01-0520205nn72nnynweekend0120202020-01Q1
202001042020-01-0420204nn61nnynweekend0120202020-01Q1
202001032020-01-0320203nn51nnynworkday0120202020-01Q1
202001022020-01-0220202nn41nnynworkday0120202020-01Q1

二、实现思路

         我们可以通过爬虫的去获取官网上的节假日信息,但是对于小白了来说是有点困难的,于是就有好多大佬写了一些工具来提供我们来使用https://github.com/Haoshenqi0123/holiday 我们可以通过 大佬提供出来的API 接口发送HTTP请求来获取数据进行解析即可获取我们想要的数据。

三、编写代码

实现步骤:

  1. 创建hive表 用来存储结果数据
  2. 编写JavaScript代码
  3. 使用kettle 整个流程连接起来

3.1 创建hive表

create database kettle;
use kettle;

CREATE TABLE kettle.`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)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  'hdfs://node01:8020/user/hive/warehouse/kettle.db'

3.2 编写 JavaScript 代码


        // 1. 初始化上游变量
        var initDateStr = "2020-01-01";
        var locale = new java.util.Locale("en", "us");
        var calendar = java.util.Calendar.getInstance();
        var sdf = new java.text.SimpleDateFormat("yyyy-MM-dd", locale);
        var initDate  = sdf.parse(initDateStr);

        calendar.setTime(initDate);
        calendar.add(java.util.Calendar.DAY_OF_MONTH, setup);

        var curDate = calendar.getTime();

        // 2. 生成维度数据
        // 2.1 生成代理键
        sdf.applyPattern("yyyyMMdd");
        var date_key = sdf.format(curDate);

        // 2.2 年-月-日
        sdf.applyPattern("yyyy-MM-dd");
        var date_value = sdf.format(curDate);

        // 2.3 当年的第几天
        var day_in_year = calendar.get(java.util.Calendar.YEAR) + "";

        // 2.4 当月的第几天
        var day_in_month = calendar.get(java.util.Calendar.DAY_OF_MONTH) + "";

        // 2.5 是否为当月的第一天
        var is_first_day_in_month = day_in_month.equals("1") ? "y":"n";

        // 2.6 是否为当月最后一天
        // 1. 加一天
        calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);

        var is_last_day_in_month = calendar.get(java.util.Calendar.DAY_OF_MONTH) == 1 ? "y":"n";
        // 2. 减回去
        calendar.add(java.util.Calendar.DAY_OF_MONTH, -1);

        // 2.7 星期
        var weekday = (calendar.get(java.util.Calendar.DAY_OF_WEEK) - 1) + "";
        if(weekday.equals("0")) {
            weekday = "7";
        }

        // 2.8 月的第几个星期
        sdf.applyPattern("W");
        var week_in_month = sdf.format(curDate);

        // 2.9 是否周一
        var is_first_day_in_week = calendar.get(java.util.Calendar.DAY_OF_WEEK) == java.util.Calendar.MONDAY ? "y":"n";

        // 2.10 是否休息日
        var is_dayoff = "n";

        // 2.11 是否工作日
        var is_workday = "n";

        // 2.12 是否国家法定节假日
        var is_holiday = "n";
        // 2.12 国家法定节假日获取URL
        //var holiday_url = "http://timor.tech/api/holiday/info/" + date_value;
		
		var holiday_url = "http://api.haoshenqi.top/holiday?date="+date_value

        // 2.13 日期类型
        var date_type = "workday";

        // 2.14 月份
        sdf.applyPattern("MM");
        var month_number = sdf.format(curDate);

        // 2.15 年份
        sdf.applyPattern("yyyy");
        var year = sdf.format(curDate);

        // 2.16 年份-月份
        sdf.applyPattern("yyyy-MM");
        var year_month_number = sdf.format(curDate);

        // 2.16 季度名称、季度、年季度
        var quarter_name = "";
        var quarter_number = "";
        var year_quarter = "";

        switch (calendar.get(java.util.Calendar.MONTH)) {
            case java.util.Calendar.FEBRUARY:
            case java.util.Calendar.JANUARY:
            case java.util.Calendar.MARCH:
                quarter_name = "Q1";
                quarter_number = "1";
                year_quarter = year + "-" + quarter_name;
                break;
            case java.util.Calendar.APRIL:
            case java.util.Calendar.MAY:
            case java.util.Calendar.JUNE:
                quarter_name = "Q2";
                quarter_number = "2";
                year_quarter = year + "-" + quarter_name;
                break;
            case java.util.Calendar.JULY:
            case java.util.Calendar.AUGUST:
            case java.util.Calendar.SEPTEMBER:
                quarter_name = "Q3";
                quarter_number = "3";
                year_quarter = year + "-" + quarter_name;
                break;
            case java.util.Calendar.OCTOBER:
            case java.util.Calendar.NOVEMBER:
            case java.util.Calendar.DECEMBER:
                quarter_name = "Q4";
                quarter_number = "4";
                year_quarter = year + "-" + quarter_name;
                break;
        }

3.3 kettle整个流程

整体流程

3.4 运行结果图

运行结果图

小结

         好了到这里我们就成功的实现了这个需求,其实kettle 上还有很多好玩的功能组件,也可以进行一个尝试。喜欢的朋友可以给你一键三连哦,源码获取微信搜搜公众号【大数据老哥】回复:【kettle日期】即可获源码。我们下期见~~~。

微信公众号搜索【大数据老哥】可以获取 200个为你定制的简历模板、大数据面试题、企业面试
题…等等。

资源获取

  • 30
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据老哥

欢迎支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值