Hadoop 带参数的配置单元UDF

Hadoop 带参数的配置单元UDF,hadoop,hive,apache-pig,user-defined-functions,user-defined-aggregate,Hadoop,Hive,Apache Pig,User Defined Functions,User Defined Aggregate,我想编写一个可以接受常量参数的自定义UDF(UDAF/UDTF) 例如,我想编写一个函数MAX(COL,I),其中COL是查找MAX值的值的集合,I是位置(即I=1,查找最高值,I=2,查找第二最高值,等等),这样配置单元查询看起来像: SELECT MAX(value, 2) FROM table; 这不仅仅适用于MAX,因此我需要一种通用的方法来实现这一点,因此从已排序的集合中进行排序和选择将不起作用。您可以使用ConstantObjectInspector获取作为参数传递的常量值。在Ge

我想编写一个可以接受常量参数的自定义UDF(UDAF/UDTF)

例如,我想编写一个函数MAX(COL,I),其中COL是查找MAX值的值的集合,I是位置(即I=1,查找最高值,I=2,查找第二最高值,等等),这样配置单元查询看起来像:

SELECT
MAX(value, 2)
FROM table;

这不仅仅适用于MAX,因此我需要一种通用的方法来实现这一点,因此从已排序的集合中进行排序和选择将不起作用。

您可以使用ConstantObjectInspector获取作为参数传递的常量值。在GenericUDF的initialize()方法或GenericUDAFEvaluator的init()中,检查指定的ObjectInspector是否是ConstantObjectInspector的实例。如果是强制转换,则抛出异常

比如说

public ObjectInspector init(Mode m, ObjectInspector[] parameters)
    throws HiveException {
     ......
    if(!( parameters[1] instanceof ConstantObjectInspector ) ) {
            throw new HiveException("Position parameter must be constant.");
        }
        ConstantObjectInspector posOI = (ConstantObjectInspector) parameters[1];
        pos = ((IntWritable) posOI.getWritableConstantValue()).get();
      ......
对于您在这里的特定用例,请查看Brickhouse()中的
collect\u max
,它收集顶部的N键和max值