最近做数据迁移项目,把聚合部分从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,返回计算结果
分享到:
相关推荐
- UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF(用户定义的表生成函数):将一行数据转换为多行,常用于数据拆分。 4. Hive参数调优: - 内存参数:如...
- 实现聚合操作,例如计算平均值、最大值等。 - **UDTF自定义表生成函数(一进多出)**: - 将单个输入行转换为多个输出行。 #### 第二部分:Hive执行原理与优化 - **Hive技术架构**: - **架构图**: 描述了Hive...
- **UDAF(User Defined Aggregate Functions)**:Java同样可以用于创建聚合函数,如求平均值、标准差等,用于处理大量数据的汇总操作。 - **UDTF(User Defined Table Generating Functions)**:这些函数可以...
UDAF则用于执行如求和、平均、最大值、最小值等聚合计算。用户需要在Java环境中编写UDF或UDAF,并将其打包成JAR文件,之后在Hive中注册并使用。 在使用Hive进行数据分析时,掌握这些函数是十分重要的。通过上述函数...
UDAF用于聚合操作,如求和、平均值等;UDTF则可以生成多行多列的数据。创建UDF通常涉及以下步骤: 1. 编写Java代码:你需要定义一个继承自Hive提供的AbstractUdf类的Java类,重写evaluate方法以实现你的函数逻辑。 ...
8. **Hive UDF(用户自定义函数)**:包括UDF(单行函数)、UDAF(聚合函数)和UDTF(多行函数),允许用户扩展Hive的功能,处理特殊数据类型或复杂逻辑。 9. **Hive与Spark集成**:使用Spark作为执行引擎,可以...
- **`avg(expr)`**:平均值 - **`min(expr)`**:最小值 - **`max(expr)`**:最大值 - **`approx_distinct(expr)`**:近似去重计数 ### 4. 内置表生成函数(UDTF) 表生成函数用于扩展查询结果集,例如: - **`...
- **UDAF(用户定义聚合函数)**:用户可以自定义聚合函数,如平均值、最大值等,以便更好地满足特定需求。 - **UDTF(用户定义表生成函数)**:这种类型的函数可以将单个输入行转换为多行输出,适用于更复杂的数据...
* AVG():计算指定列的平均值。 * MAX():计算指定列的最大值。 * MIN():计算指定列的最小值。 * COLLECT_SET():将指定列中的数据组合为数组,去重复数据。 * COLLECT_LIST():将指定列中的数据组合为数组,不去...
可以在内存占用较低的节点上启动 balancer 脚本,将 HDFS 中所有节点的存储值中的最低值和平均值的差值设置为 5%。 4. Kafka 服务器默认能接收的最大消息是 1MB。 5. 下列语句序列执行后,i 的值是 4。 6. UDAF ...