zoukankan      html  css  js  c++  java
  • UDTF

    UDTF:User-Defined Table-Generating Functions,用户定义表生成函数,用来解决输入一行输出多行

    UDF只能实现一进一出的操作,单条记录的列进行的计算操作

    UDAF实现多进一出的操作,基于表的所有记录进行的计算操作,

    • 函数类需要继承UDAF类,计算类Evaluator实现UDAFEvaluator接口
    • Evaluator需要实现UDAFEvaluator的init、iterate、terminatePartial、merge、terminate这几个函数。

           a)init函数实现接口UDAFEvaluator的init函数。
           b)iterate接收传入的参数,并进行内部的迭代。其返回类型为boolean。
           c)terminatePartial无参数,其为iterate函数遍历结束后,返回遍历得到的数据,terminatePartial类似于 hadoop的Combiner。
           d)merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。
           e)terminate返回最终的聚集函数结果。

    package hive.udaf;  
      
    import org.apache.hadoop.hive.ql.exec.UDAF;  
    import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;  
      
    public class Avg extends UDAF {  
        public static class AvgState {  
            private long mCount;  
            private double mSum;  
      
        }  
      
        public static class AvgEvaluator implements UDAFEvaluator {  
            AvgState state;  
      
            public AvgEvaluator() {  
                super();  
                state = new AvgState();  
                init();  
            }  
      
            /** 
             * init函数类似于构造函数,用于UDAF的初始化 
             */  
            public void init() {  
                state.mSum = 0;  
                state.mCount = 0;  
            }  
      
            /** 
             * iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean * * @param o * @return 
             */  
      
            public boolean iterate(Double o) {  
                if (o != null) {  
                    state.mSum += o;  
                    state.mCount++;  
                }  
                return true;  
            }  
      
            /** 
             * terminatePartial无参数,其为iterate函数遍历结束后,返回轮转数据, * terminatePartial类似于hadoop的Combiner * * @return 
             */  
      
            public AvgState terminatePartial() {  
                // combiner  
                return state.mCount == 0 ? null : state;  
            }  
      
            /** 
             * merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean * * @param o * @return 
             */  
      
            public boolean merge(AvgState avgState) {  
                if (avgState != null) {  
                    state.mCount += avgState.mCount;  
                    state.mSum += avgState.mSum;  
                }  
                return true;  
            }  
      
            /** 
             * terminate返回最终的聚集函数结果 * * @return 
             */  
            public Double terminate() {  
                return state.mCount == 0 ? null : Double.valueOf(state.mSum / state.mCount);  
            }  
        }  
    }
    

      

    1. hive>add jar /home/hadoop/udaf_avg.jar  
    2. hive>create temporary function udaf_avg 'hive.udaf.Avg'  
    3. hive>drop temporary function udaf_avg  
  • 相关阅读:
    正则表达式尽量写的精简,提高运行效率
    IndexError:string index out of range
    Python3 字符编码
    python3字符编码错误
    pip
    正则贪婪和非贪婪
    [Ss]+ 可以匹配多行html,最常用的还是.*?
    正则,分组,字符集,使用场景
    使用jodis连接codis的时候报异常:Exception in thread "main" redis.clients.jedis.exceptions.JedisException: Proxy list empty
    codis 的dashboard服务无法启动 提示pid已经运行
  • 原文地址:https://www.cnblogs.com/huiandong/p/10238795.html
Copyright © 2011-2022 走看看