python创建udf函数步骤

一、目标

实现一个函数,传入两个datetime类型的参数,返回double类型的工作日天数

二、思路

如何计算差值?
如果开始时间和结束时间在同一天:实现同 datediff(@end, @start, ‘ss’) / 86400.0
如果开始时间和结束时间在不同天:将时间分为三部分

a.
开始时间 - 开始时间当天的24点
b.
结束时间当天的0点 - 结束时间
c.
开始时间当天的24点 - 结束时间当天的0点 的工作日天数

在这里插入图片描述

三、实现

1、下载三方包

2、编译生成WHEEL包


将第三方包解压到本地,在系统的命令行窗口,切换路径至setup.py文件所在文件夹
在系统的命令行窗口,执行如下命令编译生成WHEEL包

huahuo@HUAHUOdeMacBook-Pro ~ % cd Downloads 
huahuo@HUAHUOdeMacBook-Pro Downloads % cd chinesecalendar-1.8.1
huahuo@HUAHUOdeMacBook-Pro chinesecalendar-1.8.1 % python setup.py bdist_wheel 

修改后缀为ZIP格式
在这里插入图片描述
重命名为

3、上传资源

hdfs dfs -put /path/to/chinese_holiday.zip /hdfs/path/to/work/chinese_holiday.zip

4、新建Python资源

chinese_holiday.py

● 计算 end 和 start 之间的总天数,如果发生异常(比如传入的不是有效的 datetime 对象),它将返回 None。
● 然后,从 start 日期的第二天开始迭代,一直到 end 日期的前一天。对于每一天,如果 is_holiday(start_date) 返回 True(表示这一天是节假日),则将 total_days 减一。is_holiday 函数来自于 chinese_calendar 模块,用于判断指定的日期是否为中国的节假日。
● 在迭代期间,如果发生异常(比如无法从 chinese_calendar 模块导入 is_holiday 函数或其他原因),它将返回当前计算的 total_days。
● 如果没有异常,最终返回的 total_days 将是 end 和 start 日期之间的工作日数(即剔除了节假日的天数)。
总结来说,这个自定义函数的目的是计算两个日期之间的中国工作日天数,忽略周末和公共假期。


class is_chinese_holiday(object):
    def __init__(self):
        import sys
        sys.path.insert(0, 'work/chinese_holiday.zip')

    def evaluate(self, thedate):
        from chinese_calendar import get_holiday_detail, is_in_lieu
        from datetime import datetime
        from json import dumps
        info = {'is_holiday': 'Invalid'}
        try:
            target = datetime.strptime(thedate, '%Y%m%d').date()
            detail = get_holiday_detail(target)
            info['is_holiday'] = str(detail[0])
            info['is_in_lieu'] = str(is_in_lieu(target))
            if (detail[0]):
                info['holiday_name'] = str(detail[1])
                return dumps(info)
            else:
                return dumps(info)
        except:
            return dumps(info)



class get_chinese_workdays(object):
    def __init__(self):
        import sys
        sys.path.insert(0, 'work/chinese_holiday.zip')

    def evaluate(self, end, start):
        from chinese_calendar import is_holiday
        from datetime import datetime, timedelta
        try:
            total_days = (end - start).total_seconds() / 86400.0
        except:
            return None
        try:
            start_date = start.date() + timedelta(days=1)
            while start_date < end.date():
                total_days -= int(is_holiday(start_date))
                start_date += timedelta(days=1)
            return total_days
        except:
            return total_days
            

5、新建Maxc函数

将你的 Python UDF 脚本上传到 Hive 服务器上,或者放置在一个 Hive 能够访问到的位置,确保 Hive 服务器上已经安装了 Python,并且你的脚本具有执行权限。
你需要在 Hive 会话中注册这个 Python 脚本作为一个 UDF。这可以通过 ADD FILE 命令来完成,然后使用 TRANSFORM 关键字调用这个脚本:
– 将 Python 脚本添加到 Hive
ADD FILE /path/to/chinese_holiday.py;

– 创建一个临时的自定义函数
CREATE TEMPORARY FUNCTION get_chinese_workdays AS ‘chinese_holiday.get_chinese_workdays’;

– 使用 UDF 转换数据
SELECT get_chinese_workdays (column_name)
FROM your_table;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教程】Python代码混淆工具,Python源代码保密、加密、混淆

引言 Python作为一种高级脚本语言&#xff0c;便捷的语法和丰富的库使它成为众多开发者的首选。然而&#xff0c;有时候我们希望保护我们的Python源代码&#xff0c;避免被他人轻易获取和篡改。为了实现这一目标&#xff0c;我们可以采取代码混淆的技术手段。本文将介绍Python…

vue3项目打包移除console.log()打印

一、安装terser&#xff08;不安装打包会报错&#xff0c;安装过后无需引入直接使用&#xff09; npm install terser --save-dev二、在vite.config.ts里面使用 build: {minify: "terser",terserOptions:{compress:{drop_console: true,drop_debugger: true,}}}

Vue3.0(三):Vue组件化深入理解

Vue组件化深入理解 生命周期 每个组件都可能经历 创建、挂载、更新、卸载等一系列过程 在每个阶段&#xff0c;我们可能会添加一些属于自己的逻辑代码 在Vue中&#xff0c;生命周期通过生命周期函数实现 生命周期函数实际上就是回调函数&#xff0c;在某个时间会被Vue源码调…

零售的这个销售模式,太震撼了!

随着科技的飞速发展&#xff0c;新零售模式正逐渐改变着传统零售业的面貌。在这个数字化时代&#xff0c;自动售货机作为新零售的一部分&#xff0c;正以其便捷、智能的特性&#xff0c;为商家和消费者带来全新的购物体验。 客户案例 智能便利店 传统便利店运营面临高租金、人…

【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解

&#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/qq_39344192/article/details/131470735 1. 什么是UART&#xff1f; UART是一种异步串行通信接口&#xff0c;常用于通过串口与外部设备进行通信。它通过发送和接收数据帧来实现数据传输&#xff0c;使…

保护个人信息安全,避免成为“互联网中的裸泳者”

⚽️ 一、互联网中的裸泳者&#x1f3c0; 二、代理 IP 的应用 - 解锁无限可能⚾️ 三、代理 ip 的几种类型 3.1 动态住宅代理&#xff08;Rotating Residential Proxy&#xff09;3.2 静态住宅代理&#xff08;Static Residential Proxy&#xff09;3.3 动态长效ISP&#xff08…

Nucleosome, Recombinant Human, H2BK120ub1 dNuc, Biotinylated

EpiCypher&#xff08;国内授权代理商欣博盛生物&#xff09;是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher生产的在E. coli中表达的重组人单核小体(组蛋白H2A、H2B、H3和H4各2个;accession numbers:H2A-P04908;H2B-O60814;H3.1-P68431;H4…

Python实现排序算法

目录 一&#xff1a;快速排序 二&#xff1a;合并排序 三&#xff1a;冒泡排序 四&#xff1a;插入排序 五&#xff1a;选择排序 一&#xff1a;快速排序 def quicksort(arr): if len(arr) < 1: return arr pivot arr[len(arr) // 2] le…

【Docker】入门到精通(常用命令解读)

一、准备工作 1.配置Docker的yum库 首先要安装一个yum工具 yum install -y yum-utils安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo2.安装Docker 执…

python创建pdf文件

目录 一&#xff1a;使用reportlab库 二&#xff1a;使用使pdf库 在Python中生成PDF文件可以使用多种库&#xff0c;其中最常用的是reportlab和fpdf。以下是使用这两个库生成PDF文件的示例代码&#xff1a; 一&#xff1a;使用reportlab库 1&#xff1a;写入文字信息 from r…

keil边框的背景色更改

网上有很多keil换背景色的帖子&#xff0c;效果如图&#xff1a; 可以看到&#xff0c;虽然代码区背景色设置为了黑色&#xff0c;但是上方、左侧边、下方的颜色并没有改变&#xff0c;看起来还是很不舒服。 机缘巧合&#xff0c;我想把Windows系统颜色设置为护眼的颜色&#x…

[Python图像处理] 使用OpenCV创建色调图

使用OpenCV创建色调图 色调映射和高动态范围成像应用色调映射相关链接 色调映射和高动态范围成像 高动态范围 (High Dynamic Range, HDR) 技术用于摄影成像&#xff0c;以再现比标准数字成像或摄影技术更大的动态范围的亮度。标准成像技术仅允许在一定范围内区分亮度&#xff…

yolov8使用旋转框自己做数据集检测

主要在数据集制作&#xff0c;训练的步骤和目标检测是一样的 1.数据集标注主要使用rolabelimg工具&#xff0c;这个工具不能在线安装 得下载源代码 然后运行 标注好数据保存会是一个xml文件 2.把xml文件转换成dota的xml文件&#xff0c;然后把dota的xml文件转换成dota的txt文件…

Java List的合并与切分

在Java开发中经常遇到list结构数据的处理&#xff0c;如List的合并或拆分&#xff0c;记录下来&#xff0c;方便备查。 一、List 合并 两个list数据的合并处理&#xff0c;可使用Java8 新特性的stream流&#xff0c;根据实际需要遍历取值。 1、定义 UserInfo 对象 订单bean…

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示&#xff1a;Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法

基于SpringBoot+Vue的师生疫情健康信息管理登记平台,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Acwing---830. 单调栈

单调栈 1.题目2.基本思想3.代码实现 1.题目 给定一个长度为 N N N 的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出 − 1 −1 −1。 输入格式 第一行包含整数 N N N&#xff0c;表示数列长度。 第二行包含 N N N 个整数&#xff0c…

vue2+html2pdf下载PDF,PDF分页切割

问题&#xff1a; PDF下载下来后&#xff0c;文档内容被暴力分割。 解决方案&#xff1a; HTML <!-- 打印按钮 --> <el-button type"primary" size"small" class"el-icon-download right_btn" click"downloadPDF">PDF&…

最短编辑距离问题与动态规划----LeetCode 72.编辑距离

动态规划&#xff08;Dynamic Programming, DP&#xff09;是解决复杂问题的一个强大工具&#xff0c;它将问题分解成更小的子问题&#xff0c;并使用这些子问题的解决方案来构建整体问题的解决方案。在深入探讨最短编辑距离问题之前&#xff0c;让我们先理解什么是动态规划&am…

CGAL的二维分段的Delaunay图

本章描述了CGAL的二维分段Delaunay图。我们从定义一节中的一些定义开始。2D段Delaunay图形包的软件设计在“软件设计”一节中进行了描述。在“几何特征”一节中&#xff0c;我们讨论了2D段Delaunay图包的几何特征&#xff0c;在“段Delaunay图层次结构”一节&#xff0c;简要描…