首页 > 代码库 > Hive 自定义函数 UDF UDAF UDTF
Hive 自定义函数 UDF UDAF UDTF
UDF:用户定义(普通)函数,只对单行数值产生作用;
继承UDF类,添加方法 evaluate()
/** * @function 自定义UDF统计最小值 * @author John * */ public class Min extends UDF { public Double evaluate(Double a, Double b) { if (a == null) a = 0.0; if (b == null) b = 0.0; if (a >= b) { return b; } else { return a; } } }
UDAF:用户定义聚合函数,可对多行数据产生作用;与SQL中常用的SUM(),AVG()等也是聚合函数;
聚合函数使用:
SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500
ORDER BY SUM(sales);
键字HAVING总要放在GROUP BY之后,ORDER BY之前
UDAF实现有简单与通用两种方式:
a. 简单UDAF因为使用Java反射导致性能损失,而且有些特性不能使用,已经被弃用了;
import org.apache.hadoop.hive.ql.exec.UDAF; import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; import org.apache.hadoop.io.IntWritable; //UDAF是输入多个数据行,产生一个数据行 //用户自定义的UDAF必须是继承了UDAF,且内部包含多个实现了exec的静态类 public class MaxiNumber extends UDAF { public static class MaxiNumberIntUDAFEvaluator implements UDAFEvaluator { // 最终结果 private IntWritable result; // 负责初始化计算函数并设置它的内部状态,result是存放最终结果的 @Override public void init() { result = null; } // 每次对一个新值进行聚集计算都会调用iterate方法 public boolean iterate(IntWritable value) { if (value =http://www.mamicode.com/= null) return false; if (result == null) result = new IntWritable(value.get()); else result.set(Math.max(result.get(), value.get())); return true; } // Hive需要部分聚集结果的时候会调用该方法 // 会返回一个封装了聚集计算当前状态的对象 public IntWritable terminatePartial() { return result; } // 合并两个部分聚集值会调用这个方法 public boolean merge(IntWritable other) { return iterate(other); } // Hive需要最终聚集结果时候会调用该方法 public IntWritable terminate() { return result; } } }
b. 另一种涉及两个类:AbstractGenericUDAFResolver、GenericUDAFEvaluator;
继承UDAFResolver类,重写 getEvaluator() 方法;
继承GenericUDAFEvaluator类,生成实例给getEvaluator();
在GenericUDAFEvaluator类中,重写init()、iterate()、terminatePartial()、merge()、terminate()方法;
可参考:hive udaf开发入门和运行过程详解
Hive UDAF开发详解
UDTF:User-Defined Table-Generating Functions,用户定义表生成函数;
Hive 自定义函数 UDF UDAF UDTF
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。