Hive - 自定义函数 UDF UDAF UDTF

r囧r小猫 2022-03-18 07:42 422阅读 0赞

1、UDF:用户定义(普通)函数,只对单行数值产生作用;

继承UDF类,添加方法 evaluate()

  1. /**
  2. * @function 自定义UDF统计最小值
  3. * @author John
  4. *
  5. */
  6. public class Min extends UDF {
  7. public Double evaluate(Double a, Double b) {
  8. if (a == null)
  9. a = 0.0;
  10. if (b == null)
  11. b = 0.0;
  12. if (a >= b) {
  13. return b;
  14. } else {
  15. return a;
  16. }
  17. }
  18. }

2、UDAF:User- Defined Aggregation Funcation;用户定义聚合函数,可对多行数据产生作用;等同与SQL中常用的SUM(),AVG(),也是聚合函数;

聚合函数使用:  

  1. SELECT store_name, SUM(sales)
  2. FROM Store_Information
  3. GROUP BY store_name
  4. HAVING SUM(sales) > 1500
  5. ORDER BY SUM(sales);
  6. 键字HAVING总要放在GROUP BY之后,ORDER BY之前

UDAF实现有简单与通用两种方式:

  a. 简单UDAF因为使用Java反射导致性能损失,而且有些特性不能使用,已经被弃用了;  

  1. import org.apache.hadoop.hive.ql.exec.UDAF;
  2. import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
  3. import org.apache.hadoop.io.IntWritable;
  4. //UDAF是输入多个数据行,产生一个数据行
  5. //用户自定义的UDAF必须是继承了UDAF,且内部包含多个实现了exec的静态类
  6. public class MaxiNumber extends UDAF {
  7. public static class MaxiNumberIntUDAFEvaluator implements UDAFEvaluator {
  8. // 最终结果
  9. private IntWritable result;
  10. // 负责初始化计算函数并设置它的内部状态,result是存放最终结果的
  11. @Override
  12. public void init() {
  13. result = null;
  14. }
  15. // 每次对一个新值进行聚集计算都会调用iterate方法
  16. public boolean iterate(IntWritable value) {
  17. if (value == null)
  18. return false;
  19. if (result == null)
  20. result = new IntWritable(value.get());
  21. else
  22. result.set(Math.max(result.get(), value.get()));
  23. return true;
  24. }
  25. // Hive需要部分聚集结果的时候会调用该方法
  26. // 会返回一个封装了聚集计算当前状态的对象
  27. public IntWritable terminatePartial() {
  28. return result;
  29. }
  30. // 合并两个部分聚集值会调用这个方法
  31. public boolean merge(IntWritable other) {
  32. return iterate(other);
  33. }
  34. // Hive需要最终聚集结果时候会调用该方法
  35. public IntWritable terminate() {
  36. return result;
  37. }
  38. }
  39. }

b. 另一种涉及两个类:AbstractGenericUDAFResolver、GenericUDAFEvaluator;

    继承UDAFResolver类,重写 getEvaluator() 方法;

    继承GenericUDAFEvaluator类,生成实例给getEvaluator();

    在GenericUDAFEvaluator类中,重写init()、iterate()、terminatePartial()、merge()、terminate()方法;

可参考:hive udaf开发入门和运行过程详解

      Hive UDAF开发详解

3、UDTF:User-Defined Table-Generating Functions,用户定义表生成函数,用来解决输入一行输出多行;

继承GenericUDTF类,重写initialize(返回输出行信息:列个数,类型), process, close三方法;

  可参考:hive中UDTF编写和使用(转)

      hive0.13的udtf使用例子

代码示例:

hive udtf 输入一列返回多行多列

https://blog.csdn.net/liu82327114/article/details/80684728

consult :

http://www.cnblogs.com/mzzcy/p/7119423.html

发表评论

表情:
评论列表 (有 0 条评论,422人围观)

还没有评论,来说两句吧...

相关阅读