【云计算】Hive之自定义UDAF函数解析
小标 2018-12-13 来源 : 阅读 1123 评论 0

摘要:本文主要向大家介绍了【云计算】Hive之自定义UDAF函数解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】Hive之自定义UDAF函数解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。


关于Hive自定义函数UDF的相关信息,请参考博文《Hive之——自定义函数》


用户自定义聚合函数,用户提供的多个入参通过聚合计算(求和、求最大值、求最小值)得到一个聚合计算结果的函数。


问题:UDF也可以提供输入多个参数然后输出一个结果的运算,比如加法运算add(3,5),add这个UDF需要实现UDF的evaluate方法,那么UDF和UDAF的实质分别究竟是什么?


Double evaluate(Double a, Double b)  


1.什么是UDAF


UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF。比如: Hive查询数据时,有些聚类函数在HQL没有自带,需要用户自定义实现; 用户自定义聚合函数: Sum, Average


2.实现UFAF的步骤


引入如下两下类

import org.apache.hadoop.hive.ql.exec.UDAF


import org.apache.hadoop.hive.ql.exec.UDAFEvaluator


函数类需要继承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返回最终的聚集函数结果。


3.实例


计算平均数



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);
        }
    }
}


 


4. Hive中使用UDAF


将java文件编译成udaf_avg.jar 进入hive客户端添加jar包


hive>add jar /home/hadoop/udaf_avg.jar


创建临时函数


hive>create temporary function udaf_avg 'hive.udaf.Avg'


查询语句


hive>select udaf_avg(people.age) from people


销毁临时函数


hive>drop temporary function udaf_avg


5. 总结


通过上面的介绍,可以看到UDAF的用法与UDF的区别了,UDF虽然可以接收多个入参,但是参数个数是固定的(其实也可以不固定,只要evaluate方法的参数类型是变长参数即可,但是一般不这么用),而UDAF的入参是元素个数不固定的集合,这个集合只要可遍历(使用Evaluator的iterate方法遍历)即可,上面的入参是people表的所有age列。


UDF是对只有单条记录的列进行的计算操作,而UDFA则是用户自定义的聚类函数,是基于表的所有记录进行的计算操作。


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved