`
安铁辉
  • 浏览: 244907 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hive UDAF求平均值

阅读更多
最近做数据迁移项目,把聚合部分从kettle迁移到hadoop集群上,需要写很多聚合脚本
在论坛是看到alipay同事写过类似cube的UDAF,代码拿过来运行下报错,有几个地方没看多,而且没有注释,只好从基础开始看,自己搞一个,之前写过UDF所以入手还是听快的
准备:
1、实现自己的UDAF需要集成UDAF
2、至少有一个内部类,实现了org.apache.hadoop.hive.ql.exec.UDAFEvaluator
3、必须写 inin方法
4、并且有个方法名叫iterate() 参数任意,这个方法是函数入口
5、并且要有terminatePartial,merge,terminate,算上上面的共5个方法,下面一一讲解
public class Mean extends UDAF {

	public static class MeanDoubleUDAFEval implements UDAFEvaluator {
		public static class PartialResult {
			double sum;
			long count;
		}

		private PartialResult pResult;

		@Override
		public void init() {
			pResult = null;
		}

		public boolean iterate(DoubleWritable value) {
			if (value == null) {
				return true;
			}
			if (pResult == null) {
				pResult = new PartialResult();
			}
			pResult.sum += value.get();
			pResult.count++;
			return true;
		}

		public PartialResult terminatePartial() {
			return pResult;
		}

		public boolean merge(PartialResult other) {
			if (other == null) {
				return true;
			}
			if (pResult == null) {
				pResult = new PartialResult();
			}
			pResult.sum += other.sum;
			pResult.count++;
			return true;
		}

		public DoubleWritable terminate() {
			if (pResult == null) {
				return null;
			}
			return new DoubleWritable(pResult.sum / pResult.count);
		}
	}

inin()函数可以用来做初始化操作,一般会将统计变量置空,重置内部状态
iterate方法是函数的入口,参数个数和类型和udaf实现功能息息相关
terminatePartial 需要部分聚集是调用该函数,因为计算是不同的数据块会分到不同的map端,计算之后再传输到reduce端,很多计算是可以在map后面继续计算一次,比如求最大值(求平均值则不可以),这个时候就会调用terminatePartial函数,函数必须返回一个封装了聚集计算当前状态的对象,传入reduce端
merge函数,数据传输到reduce端前调用该函数,所以入参必须和terminatePartial返回值相同
terminate函数:hive最终聚集时会调用terminate,返回计算结果
分享到:
评论

相关推荐

    hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

    - UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF(用户定义的表生成函数):将一行数据转换为多行,常用于数据拆分。 4. Hive参数调优: - 内存参数:如...

    Hive教程.pdf

    - 实现聚合操作,例如计算平均值、最大值等。 - **UDTF自定义表生成函数(一进多出)**: - 将单个输入行转换为多个输出行。 #### 第二部分:Hive执行原理与优化 - **Hive技术架构**: - **架构图**: 描述了Hive...

    hive_medo_java_hive_

    - **UDAF(User Defined Aggregate Functions)**:Java同样可以用于创建聚合函数,如求平均值、标准差等,用于处理大量数据的汇总操作。 - **UDTF(User Defined Table Generating Functions)**:这些函数可以...

    hive常用函数

    UDAF则用于执行如求和、平均、最大值、最小值等聚合计算。用户需要在Java环境中编写UDF或UDAF,并将其打包成JAR文件,之后在Hive中注册并使用。 在使用Hive进行数据分析时,掌握这些函数是十分重要的。通过上述函数...

    hive 创建自定义函数 和 hive加载说明

    UDAF用于聚合操作,如求和、平均值等;UDTF则可以生成多行多列的数据。创建UDF通常涉及以下步骤: 1. 编写Java代码:你需要定义一个继承自Hive提供的AbstractUdf类的Java类,重写evaluate方法以实现你的函数逻辑。 ...

    HIVE面试题集锦201901

    8. **Hive UDF(用户自定义函数)**:包括UDF(单行函数)、UDAF(聚合函数)和UDTF(多行函数),允许用户扩展Hive的功能,处理特殊数据类型或复杂逻辑。 9. **Hive与Spark集成**:使用Spark作为执行引擎,可以...

    hive函数.docx

    - **`avg(expr)`**:平均值 - **`min(expr)`**:最小值 - **`max(expr)`**:最大值 - **`approx_distinct(expr)`**:近似去重计数 ### 4. 内置表生成函数(UDTF) 表生成函数用于扩展查询结果集,例如: - **`...

    Hive - A Warehousing Solution Over a Map-Reduce.pdf

    - **UDAF(用户定义聚合函数)**:用户可以自定义聚合函数,如平均值、最大值等,以便更好地满足特定需求。 - **UDTF(用户定义表生成函数)**:这种类型的函数可以将单个输入行转换为多行输出,适用于更复杂的数据...

    大数据学习:Hive函数.pdf

    * AVG():计算指定列的平均值。 * MAX():计算指定列的最大值。 * MIN():计算指定列的最小值。 * COLLECT_SET():将指定列中的数据组合为数组,去重复数据。 * COLLECT_LIST():将指定列中的数据组合为数组,不去...

    大数据面试题目.docx

    可以在内存占用较低的节点上启动 balancer 脚本,将 HDFS 中所有节点的存储值中的最低值和平均值的差值设置为 5%。 4. Kafka 服务器默认能接收的最大消息是 1MB。 5. 下列语句序列执行后,i 的值是 4。 6. UDAF ...

Global site tag (gtag.js) - Google Analytics