zoukankan      html  css  js  c++  java
  • 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     }
    
    
  • 相关阅读:
    Visual Studio LightSwitch
    Android 虚拟机与真机调试配置
    点击手机 menu 硬件按钮后的显示及处理
    Windows Phone 7 真机调试
    Android 调试
    Android 新建项目 页面
    今天我的Windows Phone 7 HTC HD7 手机 升级 NoDo 了 分享一下经验
    Activity 之间调用与参数传递
    Android widget 组件
    解决 warning: found plain 'id' attribute; did you mean the new 'android:id' name? 问题
  • 原文地址:https://www.cnblogs.com/arachis/p/Hive_UDF.html
Copyright © 2011-2022 走看看