UDF(User-Defined Functions)即是用户定义的hive函数。hive自带的函数并不能完全满足业务需求,这时就需要我们自定义函数了
1.自定义udf函数需要继承org.apache.hadoop.hive.ql.exec.UDF
2.需要实现evaluate 函数,evaluate 函数支持重载。
3.udf 必须要有返回类型,可以返回null,但是返回类型不能为void;
4.udf 常用Text/LongWrite 等类型,不推荐使用java类型。
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();
}
}
}
临时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
天再高又怎么样,踮起脚尖就更接近阳光