Hive中自定义函数

 

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中的具体使用不再详述......

 

posted @ 2016-06-05 17:01  SummerChill  阅读(15515)  评论(0编辑  收藏  举报