1

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

比如我想写一个函数MAX(COL, i),其中COL是求最大值的值的集合,i是位置(即i=1,找最高,i=2,找第二高等),这样 Hive 查询看起来像:

SELECT
MAX(value, 2)
FROM table;

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

4

1 回答 1

3

您可以使用 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();
      ......

对于此处的特定用例,请查看collect_maxBrickhouse ( http://github.com/klout/brickhouse ),它收集了前 N 个键和最大值。

于 2014-06-23T17:20:43.593 回答