1、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;
            }
        }
    }

 

2、UDAF:User- Defined Aggregation Funcation;用户定义聚合函数,可对多行数据产生作用;等同与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 == 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;
        }
    }
}
View Code

相关文章:

  • 2022-01-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-25
猜你喜欢
  • 2021-10-16
  • 2021-11-27
  • 2022-12-23
  • 2021-10-19
  • 2021-05-28
  • 2022-01-23
  • 2021-06-26
相关资源
相似解决方案