ConstantObjectInspector

ConstantObjectInspector

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

例如,我想编写一个函数MAX(COL,i),其中COL是要找到最大值的值的集合,而i是位置(即,i = 1,找到最大值,i = 2,找到第二高,等等),这样Hive查询如下所示:

SELECT
MAX(value, 2)
FROM table;

这不仅是针对MAX,所以我需要一种通用的方法来执行此操作,因此无法从排序的集合中进行排序和选择。

最佳答案

您可以使用ConstantObjectInspectors获取作为参数传递的常量值。在您的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(http://github.com/klout/brickhouse)中的collect_max,它收集了前N个键和最大值。

09-11 18:52