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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM