自定义一个Hive UDF函数,功能是计算两个日期相差的天数。
第一步,创建maven工程,添加依赖的jar包
<!-- 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>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.1.0</version>
</dependency>
<!-- 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>
第二步,新建java类
该类一定要继承org.apache.hadoop.hive.ql.exec.UDF类(extends UDF)。
第三步,实现evaluate函数
在继承了UDF类中实现evaluate函数,函数名必须是evaluate,可以重载多个evaluate方法。
package cn.kgc.kb09.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Author: ChaoKeAiMuZhi
* @Date: 2020/9/22 14:44
* @Description:
**/
public class HourDiff extends UDF {
public IntWritable evaluate(Text date1,Text date2) throws Exception{
String d1 = date1.toString();
String d2 = date2.toString();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dt1 = sdf.parse(d1);
Date dt2 = sdf.parse(d2);
long diff = dt1.getTime() - dt2.getTime();
int rst = (int) (diff / 1000 / 60 / 60);
return new IntWritable(rst);
}
/* public static void main(String[] args) throws Exception{
HourDiff hd = new HourDiff();
System.out.println(hd.evaluate(new Text("2020-09-21 12:00:00"),
new Text("2020-09-22 23:00:00")));
}*/
}
第四步:打成jar包
如果没有main方法则不选择main方法。
第五步:上传jar包到Linux系统
第六步:从Linux系统上传到hdfs目录
hdfs dfs -mkdir -p /jarstore
hdfs dfs -put /root/testudf.jar /jarstore
第七步:add jar
add jar hdfs://hadoop100:9000/jarstore/testudf.jar;
第八步:create temporary function
create temporary function jar_test as "cn.kgc.kb09.udf.Homework";
第九步:运行方法
select jar_test("2020-09-21 10:00:00","2020-09-22 09:00:00");
hive> add jar /jarstore/testudf.jar;`
错误提示:
jarstore/testudf.jar does not exist
Query returned non-zero code: 1, cause: jarstore/testudf.jar does not exist
更正:
add jar hdfs://hadoop100:9000/jarstore/testudf.jar;
问题描述
使用Hive处理数据的时候,写了一个UDF,然后上传到服务器,添加到Hive中之后,一直报如下的错误:
create temporary function jar_test as "cn.kgc.kb09.udf.Homework";
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments '2': No matching method for class cn.kgc.kb09.udf.Homework with (int, int). Possible choices:
看了方法名称,感觉没错,可是后来,认真的对比了之后,发现方法名称写错了,正确的方法名称:evaluate()
解决方法:
将方法名称修改完成,然后删除Hive中已经注册的方法,退出Hive Shell界面,重新进入Hive Shell,再进行UDF注册的步骤。即可解决!有时候不退出的话,会一直报错,不会进行jar包更新。