HIVE - UDAF开发(字符串中出现 指定字符的次数,再求次数的平均数)

一、实现展示
hive> desc test_avg_str_in_str;
user_id             	int
name                	string
value               	int

hive> select * from test_avg_str_in_str;
1	awuz	1
1	azhaoz	1
2	zhangsan	2
2	lisi	2
2	wangwu	3

-- UDAF: avgStr (找到name中出现z的次数,再求平均数)
-- 难点在计算平均数的时候,中间结果需要保存 总值和计数值,需要用到 LazyBinaryStruct 结构
hive> select user_id, avgStr(name, "z") from test_avg_str_in_str group by user_id;
1	1.5
2	0.333333

PS. 这个UDAF实现的功能目前自己瞎想的,没有啥业务应用…

二、关键函数

在这里插入图片描述

  • PARTIAL1: map阶段, 调用iterate()和terminatePartial()
  • PARTIAL2: map端的Combiner阶段,调用merge() 和 terminatePartial()
  • FINAL: reduce阶段,调用merge()和terminate()
// 确定各个阶段输入输出参数的数据格式ObjectInspectors
public  ObjectInspector init(Mode m, ObjectInspector[] parameters) throws HiveException;
// 保存数据聚集结果的类
abstract AggregationBuffer getNewAggregationBuffer() throws HiveException;
// 重置聚集结果
public void reset(AggregationBuffer agg) throws HiveException;
// map阶段,迭代处理输入sql传过来的列数据
public void iterate(AggregationBuffer agg, Object[] parameters) throws HiveException;
// map与combiner结束返回结果,得到部分数据聚集结果
public Object terminatePartial(AggregationBuffer agg) throws HiveException;
// combiner合并map返回的结果,还有reducer合并mapper或combiner返回的结果。
public void merge(AggregationBuffer agg, Object partial) throws HiveException;
// reducer阶段,输出最终结果
public Object terminate(AggregationBuffer agg) throws HiveException;
三、代码CODE
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAF
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值