package my.udf;
import com.aliyun.odps.udf.UDAF;
import com.aliyun.odps.udf.UDAFEvaluator;
/***
* BASE UDAF
*/
public class MyUDAF extends UDAF {
/**
* 保存中间结果的类
*
* 中间结果必须能合并,并且空间复杂度为O(1),不能随着数据量而膨胀
*/
public static class PartialResult {
// TODO: 按需定义中间结果
public String str;
public Long sum;
}
/**
* 实际执行计算的内联类,必须实现UDAFEvaluator
*/
public static class VarianceEvaluator implements UDAFEvaluator {
private PartialResult partial;
/**
* 构造函数中生成PartialResult对象
*/
public VarianceEvaluator() {
partial = new PartialResult();
}
/**
* UDAF Init接口
*
* 对中间数据对象字段初始化
*/
public void init() {
// TODO: 初始化中间结果字段
partial.sum = 0L;
partial.str="";
}
/**
* UDAF Iterate接口
*
* 对每条记录调用一次,这里是讲新的实数合并到中间结果
*/
public void iterate(Long x,Long y) {
// TODO: 按需定义参数并实现自己的逻辑
partial.str=partial.str+x.toString()+","+y.toString()+",";
}
/**
* UDAF TerminatePartial接口
*
* 当一个节点完成计算时,节点的最终结果
*
* @return 节点最终结果
*/
public PartialResult terminatePartial() {
return partial;
}
/**
* UDAF Merge接口
*
* 讲另外一个节点的最终结果合并到本节点
*
* @param pr
* 另外节点的最终结果
*/
public void merge(PartialResult pr) {
if (pr == null) {
return;
}
partial.str=partial.str+""+pr.str;
}
/**
* UDAF Terminate接口
*
* 全部任务完成后,输出最终结果。
*
* @return 最终结果
*/
public String terminate() {
return partial.str.toString();
}
/**
* UDAF SetPartial接口
*
* 对一个新的节点设置中间结果
*
* @param pr
* 中间结果
*/
public void setPartial(PartialResult pr) {
if (pr == null) {
return;
}
partial = pr;
}
}
}