功能:
通过人的生日,算出人的生肖和星座。
先在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:
查询:
好了!这个自定义函数完成了。