Hive学习—UDF函数

林星阑
2023-12-01

一、简述

UDF(User-Defined Functions)即是用户定义的hive函数。hive自带的函数并不能完全满足业务需求,这时就需要我们自定义函数了

二、实现UDF注意事项

1.自定义udf函数需要继承org.apache.hadoop.hive.ql.exec.UDF
2.需要实现evaluate 函数,evaluate 函数支持重载。
3.udf 必须要有返回类型,可以返回null,但是返回类型不能为void;
4.udf 常用Text/LongWrite 等类型,不推荐使用java类型。

三、Java编写UDF代码

1.导包 hadoop-common、hive-exec

 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.1.0</version>
    </dependency>

2.实现返回年和季度的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;
//类继承UDF
public class MyQuarter extends UDF{
	//实现evaluate方法
	//返回值,参数类型是hadoop类型,参数是字段值
	public static Text evaluate(Text text){
		try{
			//通过SimpleDateFormat将文本类型转为日期类型
			SimpleDateFormate sdf = new SimpleDateFormat("yyyy-MM-dd");
			Date date = sdf.parse(text.toString);
			
			//通过Calender类获取年份和月份
			Calender cal = Calender.getInstance();
			cal.setTime(date);		
			int month = cal.get(Calender.Month);
			String m =cal.get(Calender.year)+"year,";
			
			//判断月份的季度
			swith(month){
				 case 1:case 2:case 3:
	                m+="first quarter";
	                break;
	            case 4: case 5: case 6:
	                m+="second quarter";
	                break;
	            case 7: case 8: case 9:
	                m+="third quarter";
	                break;
	            case 10: case 11: case 12:
	                m+="fourth quarter";
	                break;
	            default:
	                m+="month is error";
			}
		}catch(ParseException e){
			e.printStackTrace();
		}
	}
}

四、hive中创建UDF函数

临时UDF函数(关闭hive后消失)

1.将Java代码打包传到Linux
2.上传到hdfs
3.use 具体数据库
4.add jar hdfs://192.168.56.100:9000/path
5.create temporary function 函数名 as “包名+类名”

长久UDF函数(关闭hive后依然存在)
前3步相同,第四步为 create function 函数名 as “包名+类名” using jar hdfs://192.168.56.100:9000/path

如果不想要该函数了,可以通过如下命令删除
Drop function function_name

天再高又怎么样,踮起脚尖就更接近阳光

 类似资料: