Hive自定义函数—剔除周日周六(小时级别)

🐱背景🍎


Hello,小伙伴们,许久不见,最近遇到一个需求场景,关于物流时差的计算,要求算出差值是小时,且要剔除周日周六,网上很多文章,最好的也就是按照天剔除周日周六,小时级别,考虑的情况会非常多,要比天麻烦太多,最后无奈自己制作,分享给大家且记录一下,有需要的直接Copy下方核心代码 !😊 还请留下你的赞赞👍


☕️代码如下(Java)

package com.trendsi.udf;import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;public class NonWeekendHoursDiffUDF extends UDF {//    public static void main(String[] args) {
//        NonWeekendHoursDiffUDF udf = new NonWeekendHoursDiffUDF();
//
//        // 测试用例1:开始时间是周一,结束时间是周三
//        Text startTime1 = new Text("2023-03-02 00:00:00"); // 周一
//        Text endTime1 = new Text("2023-03-03 00:00:00"); // 周三
//        Integer hoursDiff1 = udf.evaluate(startTime1, endTime1);
//        System.out.println("Case 1: Non-weekend hours difference = " + hoursDiff1);
//
//        // 测试用例2:开始时间是周六,结束时间是下一个周一
//        Text startTime2 = new Text("2023-03-04 09:00:00"); // 周六
//        Text endTime2 = new Text("2023-03-06 09:00:00"); // 下一个周一
//        Integer hoursDiff2 = udf.evaluate(startTime2, endTime2);
//        System.out.println("Case 2: Non-weekend hours difference = " + hoursDiff2);
//
//        // 测试用例3:开始时间和结束时间都是周六
//        Text startTime3 = new Text("2023-03-04 09:00:00"); // 周六
//        Text endTime3 = new Text("2023-03-05 09:00:00"); // 下一个周六
//        Integer hoursDiff3 = udf.evaluate(startTime3, endTime3);
//        System.out.println("Case 3: Non-weekend hours difference = " + hoursDiff3);
//
//        // 测试用例4:开始时间是周五,结束时间是下一个周一的凌晨
//        Text startTime4 = new Text("2023-03-03 13:00:00"); // 周五
//        Text endTime4 = new Text("2023-03-20 00:00:00"); // 下一个周一的凌晨
//        Integer hoursDiff4 = udf.evaluate(startTime4, endTime4);
//        System.out.println("Case 4: Non-weekend hours difference = " + hoursDiff4);
//    }private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public Integer evaluate(Text startTime, Text endTime) {try {Date startDate = sdf.parse(startTime.toString());Date endDate = sdf.parse(endTime.toString());Calendar startCal = Calendar.getInstance();startCal.setTime(startDate);Calendar endCal = Calendar.getInstance();endCal.setTime(endDate);// 如果开始时间是周末,则调整到下一个周一的0点if (isWeekend(startCal)) {adjustToNextWeekday(startCal, Calendar.MONDAY);}// 如果结束时间是周末,则调整到下一个周一的前一秒(即周日23:59:59)if (isWeekend(endCal)) {// 注意:这里应该是调整到下一个周一的前一天(周日),然后设置时间为23:59:59adjustToNextWeekday(endCal, Calendar.MONDAY);endCal.add(Calendar.DAY_OF_YEAR, -1);endCal.set(Calendar.HOUR_OF_DAY, 23);endCal.set(Calendar.MINUTE, 59);endCal.set(Calendar.SECOND, 59);}int hoursDiff = 0;while (startCal.before(endCal)) {// 只在非周末时增加小时数if (!isWeekend(startCal)) {hoursDiff++;}startCal.add(Calendar.HOUR_OF_DAY, 1);}return hoursDiff;} catch (ParseException e) {e.printStackTrace();return null;}}private boolean isWeekend(Calendar cal) {int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY;}private void adjustToNextWeekday(Calendar cal, int dayOfWeek) {int diff = dayOfWeek - cal.get(Calendar.DAY_OF_WEEK);if (diff <= 0) {diff += 7;}cal.add(Calendar.DAY_OF_YEAR, diff);cal.set(Calendar.HOUR_OF_DAY, 0);cal.set(Calendar.MINUTE, 0);cal.set(Calendar.SECOND, 0);}private void adjustToWeekday(Calendar cal, int dayOfWeek) {int diff = dayOfWeek - cal.get(Calendar.DAY_OF_WEEK);if (diff > 0) {cal.add(Calendar.DAY_OF_YEAR, diff);} else {cal.add(Calendar.DAY_OF_YEAR, diff - 7);}}
}

简单使用

  • 前提:我这里用的IDEA,Maven,Java 这些基础不再赘述,网上很多教程,关于Hive内的使用如下:
-- 打包的jar包放到你想放的地方,执行下面命令,将jar包添加至hive
add jar hdfs://xxxxxxxx/udf/xxxxx.jar;
-- 根据类的全部包名创建hive函数
create function NonWeekendHoursDiffUDF as 'com.xxx.udf.xxx' using jar 'hdfs://xxxxxxxx/udf/xxxxx.jar'
-- 最后直接测试即可
select  NonWeekendHoursDiffUDF('2024-09-09 02:20:00','2024-09-10 01:00:00')

Java很久没写了,欢迎大佬提建议,其余有问题随时留言,一定回复~🐶 封面献上~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464457.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中的继承——第二篇

一、继承与友元 友元关系不能够继承&#xff08;就像父亲的朋友不一定是自己的朋友&#xff09; 具体实现起来就是父类的友元可以访问父类的成员&#xff0c;但是不可以访问子类的成员 二、继承与静态成员 子类的静态成员变量本质上与父类的是同一份&#xff0c;存储在静态…

02多线程基础知识

目录 1. 线程与进程 进程&#xff08;Process&#xff09; 线程&#xff08;Thread&#xff09; 2. 并发和并行 并发&#xff08;Concurrency&#xff09; 并行&#xff08;Parallelism&#xff09; 3. CPU 调度 定义 类型 调度算法 上下文切换 4.线程间的状态流转…

基于SpringBoot+Gpt个人健康管家管理系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

Kotlin by lazy和lateinit的使用及区别

在 Kotlin 中&#xff0c;lateinit 和 by lazy 都可以用来延迟初始化变量&#xff0c;但它们有不同的适用场景和使用方式。下面详细介绍它们的用法和区别。 1.lateinit lateinit 关键字用于延迟初始化 可变属性 (var)&#xff0c;主要用于那些在声明时不能立即初始化&#xf…

提高文本处理效率:精通awk命令中的$NF

在AWK编程语言中&#xff0c;$NF是一个特定的变量&#xff0c;用于引用当前处理记录中的最后一个字段值。这里的NF是AWK的一个内置变量&#xff0c;表示当前记录所含字段的数量。通过使用$NF&#xff0c;可以直接获取到与NF数值相对应的那个字段的具体内容。 示例使用 以下文件…

通讯学徒学习日记

本章内容为 长期更新模式&#xff0c;目前入职的第三天&#xff0c;学徒状态。 文章目录 前言开始接水晶头、接光纤水晶头接光纤 PON&#xff08;GPON 、EPON&#xff09;AON 和 PON 的详解AONPON 前言 编程虽然是爱好&#xff0c;但确实也想把这份爱好变成工作。但是对于目前刚…

SpringBoot在线教育系统:集成第三方服务

5系统详细实现 5.1 普通管理员管理 管理员可以对普通管理员账号信息进行添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 普通管理员管理界面 5.2 课程管理员管理 管理员可以对课程管理员进行添加修改删除操作。具体界面如图5.2所示。 图5.2 课程管理员管理界面 5.3 …

【用Java学习数据结构系列】泛型上界与通配符上界

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study 专栏&#xff1a;用Java学习数据结构系列 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff…

backtrader下的轮动策略模板,附年化20.6%的策略源码。

原创内容第700篇&#xff0c;专注量化投资、个人成长与财富自由。 原创日更700天&#xff0c;回首向来萧瑟处&#xff0c;也无风雨也无晴。 但行好事&#xff0c;莫问前程&#xff0c;持续改1%&#xff0c;为社群的同学们提供价值。 今天我们实现backtrader下的轮动策略模板…

B2109 统计数字字符个数

B2109 统计数字字符个数 #include <iostream> using namespace std; # include <string.h> #include <ctype.h> #include <algorithm> int main(){ char str[256]; cin.getline(str,256); //fgets(str,256,stdin); int cnt 0; //for(size_t i 0…

使用AWS Lambda构建无服务器应用程序

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用AWS Lambda构建无服务器应用程序 AWS Lambda 简介 创建 AWS 账户 创建 Lambda 函数 配置触发器 编写和测试代码 示例代码&am…

如何在Word的表格中一次性插入多行?

当我们想在Word中的表格中一次性插入多行时&#xff0c;却发现内置的插入功能并没有插入行数选项。 此时我们只需要选择多行&#xff0c;例如&#xff0c;选择5行&#xff0c;以同样的步骤插入&#xff0c; 在下方就新增了5行。 同理&#xff0c;插入其他自定义行数。

【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024,11月29-12月1日)

大会官网&#xff1a;www.icadi.net (CVA为ICADI分会&#xff0c;网站沿用主会议&#xff1b;议程、出版将以主会为准&#xff09; 大会时间&#xff1a;2024年11月29-12月1日 大会地点&#xff1a;中国-天津 终轮截稿&#xff1a;2024年11月22号&#xff08;特殊情况联系会…

火山引擎VeDI数据服务平台:在电商场景中,如何解决API编排问题?

01 平台介绍 数据服务平台可以在保证服务高可靠性和高安全性的同时&#xff0c;为各业务线搭建数据服务统一出口&#xff0c;促进数据共享&#xff0c;为数据和应用之间建立了一座“沟通桥梁”。 同时&#xff0c;解决数据理解困难、异构、重复建设、审计运维困难等问题&#x…

网付碰一下支付系统功能分享来了!

随着碰一下支付代理骗局的持续曝光&#xff0c;越来越多的人都开始将目光转向了碰一下支付系统源码部署这一入局方式之上&#xff0c;使得这一项目愈加火爆的同时&#xff0c;也让网付等头部聚合支付公司成为了大家关注的焦点&#xff0c;连带着网付碰一下支付系统有哪些功能这…

ElasticSearch学习篇16_《检索技术核心20讲》进阶篇之空间检索

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 相关问题&#xff1a; 查询范围固定的需求 直接计算两点之间距离区域二进制编码GeoHash编码 查询范围不固定的需求 GeoHash编码索引结构设计 基于…

SSH详解

一、SSH 引入 在使用 https 协议访问我们的 Gitee 库的时候&#xff0c;如果我们想要克隆一个私有库&#xff0c;或者说想要使用 git push&#xff0c;我们都需要输入账户账号和密码&#xff0c;这样十分繁琐而且很不安全。 虽然我们可以使用 Git for Windows 的 Git Credent…

互联网大厂钟爱的压测工具分享,战绩可查!

双11来了&#xff0c;又到了一些互联网大厂技术团队疯狂&#xff08;~~加班&#xff09;~~备战的紧张时刻。 今天&#xff0c;为大家带来一期“互联网大厂亲测的压测工具分享”&#xff0c;并在结尾附上30天SaaS版免费体验&#xff01; 压力测试相比于监控而言&#xff0c;是…

mac-泛洪

泛洪攻击的类型 TCP SYN Flood&#xff1a; 攻击者向目标服务器发送大量的 TCP SYN 请求&#xff0c;但不完成握手过程。服务器为每个请求分配资源&#xff0c;最终可能耗尽其连接表&#xff0c;导致无法处理正常请求。 UDP Flood&#xff1a; 攻击者向目标发送大量的 UDP 数据…

【数据分享】1901-2023年我国省市县镇四级的逐年最高气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最高气温栅格数据和Excel和Shp格式的省市县镇四级逐月最高气温数据&#xff0c;原始的逐月最高气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月数据我们采用求年平均值的方法得到逐年最高…