首页 > 技术文章 > Hive的自定义函数

kwzblog 2017-09-06 16:38 原文

功能:

通过人的生日,算出人的生肖和星座。

先在hive中创建一个表:

往这表中导入数据:

导入的数据为:

可以成功查询:

编写自定义函数代码:如下

 

 1 package cn.tendency.wenzhouhbase.UdfHive;
 2 
 3 import java.sql.Date;
 4 import java.util.Calendar;
 5 
 6 import org.apache.hadoop.hive.ql.exec.UDF;
 7 import org.apache.hadoop.io.IntWritable;
 8 import org.apache.hadoop.io.Text;
 9 
10 public class MyZodiaAndC extends UDF{
11     
12     /**
13      * 
14      * @param date,注意,如果使用的参数是Date,必须是java.sql.Date,
15      *           这里无法识别
16      * @param type 1==>生肖,0==》星座
17      * @return
18      */
19      public Text evaluate(Date date, IntWritable type) {
20          if(type.get() == 1) { //生肖
21              return new Text(getZodica(date));
22          } else if(type.get() == 0) { //星座
23              return new Text(getConstellation(date));             
24          } else {
25              return null;
26          }
27      }
28      
29      public  final String[] zodiacArr = { "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊" };
30      
31      public  final String[] constellationArr = { "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "魔羯座" };
32       
33      public  final int[] constellationEdgeDay = { 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22 };
34       
35      /**
36       * 根据日期获取生肖
37       * @return
38       */
39      public  String getZodica(java.util.Date date) {
40          Calendar cal = Calendar.getInstance();
41          cal.setTime(date);
42          return zodiacArr[cal.get(Calendar.YEAR) % 12];
43      }
44       
45      /**
46       * 根据日期获取星座
47       * @return
48       */
49      public String getConstellation(java.util.Date date) {
50          if (date == null) {
51              return "";
52          }
53          Calendar cal = Calendar.getInstance();
54          cal.setTime(date);
55          int month = cal.get(Calendar.MONTH);
56          int day = cal.get(Calendar.DAY_OF_MONTH);
57          if (day < constellationEdgeDay[month]) {
58              month = month - 1;
59          }
60          if (month >= 0) {
61              return constellationArr[month];
62          }
63          // default to return 魔羯
64          return constellationArr[11];
65      }
66     
67 //     public void test() {
68 //         
69 //         System.out.println(getConstellation(new java.util.Date()));
70 //         System.out.println(getZodica(new java.util.Date()));
71 //     }
72      
73 }

 

 打包:

把包上传到HiveUdfJar目录下:

把jar包添加到hive中:

创建临时函数shengxiao:

查询:

 

好了!这个自定义函数完成了。

推荐阅读