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