UDF简记

摘要:
  1.开发UDF
   2.开发UDAF
   3.开发UDTF
   4.部署与测试
   5.一个简单的实例
内容:
1.开发UDF
  函数类需要继承org.apache.hadoop.hive.ql.UDF

实现evaluate函数

2.开发UDAF
  
  函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口。

  Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数

    init函数实现接口UDAFEvaluator的init函数。

    iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。

    terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。

    merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。

    terminate返回最终的聚集函数结果。

3.开发UDTF   
函数类需要继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF

实现initialize, process, close三个方法。

  initialize方法返回UDTF的返回行的信息(返回个数,类型)

  process方法对传入的参数进行处理,可以通过forword()方法把结果返回

  close()方法需要清理的方法进行清理

4.部署与测试

打包上传到HDFS

hadoop fs -put my-udf.jar /hive_functions
hive>add jar hdfs://namenode_host:8020/hive_functions/my-udf.jar;
hive>create temporary function parse_json_array as 'hive.udf.yourUDF';

5.一个简单的实例(github地址)
 1 import org.apache.commons.lang.StringUtils;
 2 import org.apache.hadoop.hive.ql.exec.UDF;
 3 import org.json.JSONArray;
 4 import org.json.JSONException;
 5 import org.json.JSONTokener;
 6 
 7 import java.util.ArrayList;
 8 
 9 /**
10  * Created by arachis on 2017/10/19.
11  * 一个简单的UDF:
12  *  解析json array中的指定字段,并用下划线拼接起来
13  */
14 public class MyUDF extends UDF {
15     /**
16      * 把json array字符串中指定的字段解析出来
17      * @param jsonArrayStr 要解析的json array字符串
18      * @param column 要提取的字段
19      * @return str
20      *
21      * hive example:
22      *  hive>select *,parse_json_array(get_json_object('{"data":[{"id":1082},{"id":1082},{"id":1082}]}','$.data'),'id') from dual;
23      *  hive>+-----------+-----------------+--+
24     | dual.foo  |       _c1       |
25     +-----------+-----------------+--+
26     | NULL      | 1082_1082_1082  |
27     +-----------+-----------------+--+
28      */
29     public String evaluate(String jsonArrayStr,String column) {
30         if((jsonArrayStr==null)|| StringUtils.isBlank(jsonArrayStr)||! jsonArrayStr.trim().startsWith("[")){
31             return null;
32         }
33         JSONArray jsonArray = null;
34         ArrayList<String> tag_ids = new ArrayList<String>();
35         try {
36             jsonArray = new JSONArray(new JSONTokener(jsonArrayStr));
37             for(int i=0;i<jsonArray.length();i++){
38                 String json = jsonArray.getJSONObject(i).get(column).toString();
39                 tag_ids.add( json );
40             }
41         } catch (JSONException e) {
42             e.printStackTrace();
43         }
44 
45 
46         return StringUtils.join( tag_ids,'_' );
47     }
48 
49     public static void main(String[] args) {
50         String jas = "[{\"id\":1082},{\"id\":1082},{\"id\":1082}]";
51         System.out.println(new MyUDF().evaluate(jas,"id") );
52 
53     }

posted @ 2017-10-19 16:51  混沌战神阿瑞斯  阅读(619)  评论(0编辑  收藏  举报