Hive的自定义的函数的步骤:
1°、自定义UDF extends org.apache.hadoop.hive.ql.exec.UDF
2°、需要实现evaluate函数,evaluate函数支持重载
3°、把程序打包放到目标机器上去
4°、进入hive客户端,添加jar包:hive>add jar jar路径
5°、创建临时函数:hive> create temporary function 自定义名称 AS '自定义UDF的全类名'
6°、执行HQL语句;
7°、销毁临时函数:hive> drop temporary function 自定义名称
在hive的hive-exec-1.0.0.jar中有如下结构(这是Hive中的内嵌函数的源码):
![]()
举一个例子:是<hive编程指南>中的一个经典案例.
统计显示生效和星座
输入日期显示字符串.
如果是0就显示生肖,如果是1就显示星座.
示例代码如下:
1 import java.sql.Date;
2 import java.text.SimpleDateFormat;
3 import java.util.Calendar;
4
5 import org.apache.hadoop.hive.ql.exec.UDF;
6 import org.apache.hadoop.io.Text;
7 import org.junit.Test;
8
9 public class UDFZodiacAndConstellation extends UDF {
10 public Text evaluate(Date date, int type) {
11 // 这个地方Date的类型是java.sql.Date,和数据库打交道的都是这个.
12 // 还可以用DateWritable,这个类面封装了一个java.sql.Date类型.
13 java.util.Date uDate = new java.util.Date(date.getTime());
14 if (type == 0) {// 生肖
15 return new Text(getZodica(uDate));
16 } else if (type == 1) {// 星座
17 return new Text(getConstellation(uDate));
18 } else {
19 return new Text("NULL");
20 }
21 }
22
23 public final String[] zodiacArr = { "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔","龙", "蛇", "马", "羊" };
24 public final String[] constellationArr = { "水瓶座", "双鱼座", "白羊座", "金牛座","双子座", "巨蟹座", "狮子座", "处女座",
25 "天秤座", "天蝎座", "射手座", "魔羯座" };
26 public final int[] constellationEdgeDay = { 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22 };
27
28 /**
29 * 根据日期获取生肖
30 */
31 public String getZodica(java.util.Date date) {
32 Calendar cal = Calendar.getInstance();
33 cal.setTime(date);
34 return zodiacArr[cal.get(Calendar.YEAR) % 12];
35 }
36
37 /**
38 * 根据日期获取星座
39 */
40 public String getConstellation(java.util.Date date) {
41 if (date == null) {
42 return "";
43 }
44 Calendar cal = Calendar.getInstance();
45 cal.setTime(date);
46 int month = cal.get(Calendar.MONTH);
47 int day = cal.get(Calendar.DAY_OF_MONTH);
48 if (day < constellationEdgeDay[month]) {
49 month = month - 1;
50 }
51 if (month >= 0) {
52 return constellationArr[month];
53 }
54 // default to return 魔羯
55 return constellationArr[11];
56 }
57
58 /**
59 * 测试方法
60 */
61 @Test
62 public void test() throws Exception {
63 System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-09")));
64 System.out.println(getConstellation(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
65 System.out.println(getZodica(new SimpleDateFormat("yyyy-MM-dd").parse("2016-07-31")));
66 }
67 }
然后对这个java文件打包放到Linux中,此处是放到了/usr/local/data/calc-cz.jar
![]()
show functions 能够找到这个创建的cz函数.
![]()
查看该自定义函数的函数描述:
![]()
在jar源代码包中看关于hive内置year函数的源码:
![]()
可以仿照这个内置的函数在编写自定义hive函数的时候,定义函数的描述description.
year函数在hive中的描述
![]()
关于上面自定义的函数的在hive中的具体使用不再详述......
本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5561113.html,如需转载请自行联系原作者