hive UDF 日期转为周数

本文介绍了如何在Hive中使用UDF(用户定义函数)将日期转换为周数。Hive的UDF需继承UDF类并实现evaluate方法。Hive通过自定义UDFMethodResolver配置调用方法,每个JVM实例化一个UDF实例。UDF的evaluate方法可返回Java原生类型或Writable类,避免返回null。部署UDF涉及将jar包上传到HDFS,然后创建临时或永久function。临时function只在当前会话生效,而永久function需指定数据库并在所有会话中可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UDF api:

https://hive.apache.org/javadocs/r1.2.2/api/org/apache/hadoop/hive/ql/exec/UDF.html

Hive的用户定义函数需要继承UDF类,实现evaluate方法(一个或多个);该方法由hive调用。

Hive解析要调用的方法的确切方式可以通过设置自定义UDFMethodResolver来配置(传入构造器); 

定义的UDF类会在每个JVM中实例化出一个实例,并且不会被并发调用。

evaluate方法的返回类型以及方法参数可以是Java原语或相应的Writable类。理论上evaluate不应该返回null值,但是可以把方法设为void。

package hiveudf;

import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;

//Description注解部分提供函数的帮助信息. 
@Description(name = "DateToWeek", value = "_FUNC_(date) - Convert yyyyMMdd to yyyyWww.")
public class UDFtime extends UDF {
	// evaluate方法的输入输出即是UDF函数的输入输出.
	public String evaluate(String date) {
		StringBuilder sb = new StringBuilder();
		int year = Integer.parseInt(date.substring(0, 4));
		int mon = Integer.parseInt(date.substring(4, 6));
		int day = Integer.parseInt(date.substring(6, 8));
		boolean ry = false;
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
			ry = true;
		if (ry) {
			for (int i = 1; i < mon; i++) {
				day += montoday_r[i];
			}
		} else {
			for (int i = 1; i < mon; i++) {
				day += montoday[i];
			}
		}
		int week = day / 7;
		if (day % 7 != 0)
			week++;
		sb.append(year);
		sb.append('W');
		if (week < 10)
			sb.append(0).append(week);
		else
			sb.append(week);
		return sb.toString();
	}

	int[] montoday = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	// 闰年
	int[] montoday_r = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
}

部署方法:

在hdfs中上传jar包;

在hive中添加function:

  • 创建临时function
CREATE TEMPORARY FUNCTION datetoweek as 'hiveudf.UDFtime' using jar 'hdfs:///user/jar/hiveUDF/UDFtime.jar'

临时function 只在当前会话中有效,退出就会失效,每次打开都需要添加;同时临时function不能指定数据库

  • 创建永久function
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
CREATE FUNCTION default.datetoweek as 'hiveUDF.UDFtime' using jar 'hdfs:///user/jar/hiveUDF/UDFtime.jar'

永久function会一直生效,且需要为函数指定数据库; 

参考:https://blog.youkuaiyun.com/liam08/article/details/51311772

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值