hive自定义UDAF函数

hive自定义UDAF函数
  1. 函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口。

  2. Evaluator需要实现 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 terminatePartial(Double o) {                
         if (o != null) {
                   state.mCount += o.mCount;
                   state.mSum += o.mSum;
         }
 
         return true;
}
 
/** * terminate返回最终的聚集函数结果 * * @return */
 
public Double terminate() {
         return state.mCount == 0 ? null : Double.valueOf(state.mSum / state.mCount);
}
 
}
  1. 执行求平均数函数的步骤

a)将java文件编译成Avg_test.jar。
b)进入hive客户端添加jar包: hive>add jar /run/jar/Avg_test.jar。
c)创建临时函数: hive>create temporary function avg_test ‘hive.udaf.Avg’;
d)查询语句: hive>select avg_test(scores.math) from scores; e)销毁临时函数: hive>drop temporary function avg_test;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值