Hive学习之自定义聚合函数

      Hive支持用户自定义聚合函数(UDAF),这种类型的函数提供了更加强大的数据处理功能。Hive支持两种类型的UDAF:简单型和通用型。正如名称所暗示的,简单型UDAF的实现非常简单,但由于使用了反射的原因会出现性能的损耗,并且不支持长度可变的参数列表等特征。而通用型UDAF虽然支持长度可变的参数等特征,但不像简单型那么容易编写。

      这篇文章将学习编写UDAF的规则,比如需要实现哪些接口,继承哪些类,定义哪些方法等, 实现通用型UDAF需要编写两个类:解析器和计算器。解析器负责UDAF的参数检查,操作符的重载以及对于给定的一组参数类型查找正确的计算器。计算器实现实际UDAF的计算逻辑。通常解析器可以实现org.apache.hadoop.hive.ql.udf.generic.GenericUDAFResolver2接口,但建议继承org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver抽象类,该类实现了GenericUDAFResolver2接口。计算器需要继承org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator抽象类,并做为解析器的内部静态类实现。

      解析器的类型检查确保用户传递正确的参数,比如UDAF的参数为Integer类型,那么用户传递Double就需要抛出异常。操作符重载则允许为不同类型的参数定义不同的UDAF逻辑。在编码之前,先了解一下AbstractGenericUDAFResolver类,该类有两个重载的方法public GenericUDAFEvaluator getEvaluator(GenericUDAFParameterInfoinfo)和public GenericUDAFEvaluatorgetEvaluator(TypeInfo[] info),其中前者不再建议使用,这样继承该类时只覆盖第二个方法即可。该方法的参数类型为TypeInfo[],返回值为GenericUDAFEvaluator,在该方法中完成参数的检查,不仅包括参数的数量还有参数的类型。TypeInfo位于包org.apache.hadoop.hive.serde2.

你可能感兴趣的:(Hive,勤奋的Hive)