1.java 继承UDF类编写udf函数(evaluate())(一个类一个方法)
2.打fat包(包括所有依赖文件)
3.把jar包放到linux上
1.在hive命令行中使用add jar jar包路径即可加载到临时系统中
2.create temporary function 函数名() as ‘方法的全类名’
1.在liunx命令行使用hdfs命令把jar包上传到hdfs路径
2.create function 函数名 as ‘方法的全类名’using jar ‘jar包的hdfs路径’;
首先创建maven工程
在打上勾,选择
pom.xml 里面输入
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>2.6.0version>
dependency>
<dependency>
<groupId>org.apache.hivegroupId>
<artifactId>hive-execartifactId>
<version>1.2.1version>
dependency>
上面的jdk需要和本机的jdk版本一至
1.在一个时间基础上进行小时的加减得到新的时间
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.Calendar;
import java.util.Date;
/**
* @Author :Ersan
* @Date 2020/9/22
* @Description
*/
public class AddHour extends UDF {
public Text evaluate(Text beforeDate, IntWritable hours) throws Exception{
//把接收到的字符串和整形转成java的类型
String d=beforeDate.toString();
String[] dAndT = d.split(" ");
String[] day = dAndT[0].split("-");
String[] time = dAndT[1].split(":");
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(d);
String rst = sdf.format(new Date(date.getTime() + hours.get() * 60 * 60 * 1000));
return new Text(rst);
}
public static void main(String[] args) throws Exception{
AddHour ah=new AddHour();
Text t=new Text("2020-09-22 10:20:00");
IntWritable iw =new IntWritable(3);
System.out.println(ah.evaluate(t, iw));
}
}
java main方法的结果:
2020-09-22 13:20:00
2.计算两个时间的时间差(小时差)
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 :Ersan
* @Date 2020/9/22
* @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")));
}
}
java main方法的结果:
-35
1.把jar包导入到linux里面(我这里连同main方法一起打过来了)
所以需要在linux里面把jar包中的main方法删除(没有main方法也需要以下操作,至少我这里试过):
zip -d jar包地址 'META-INF/.RSA' 'META-INF/*SF'
当然需要提前下载zip:
yum -y install zip
2.把linux中的jar包上传到hdfs(为下面的永久udf函数做准备)
3.打开hive
1.add jar jar包全路径;
2.create temporary function 方法名 as ‘方法的全类名(cn.kgc.kb09.udf.AddHour)’;
3.使用函数方法: select 方法名(“参数”);
1.create function 函数名 as ‘方法的全类名’ using jar ‘jar包的hdfs路径’;
2.使用函数方法: select 方法名(“参数”);