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  
posted @ 2019-01-08 14:26  uuhh  阅读(3079)  评论(0编辑  收藏  举报