带参数的Hive UDF

时间:2014-06-22 16:14:24

标签: hadoop hive apache-pig user-defined-functions user-defined-aggregate

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

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

SELECT
MAX(value, 2)
FROM table;

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

1 个答案:

答案 0 :(得分:3)

您可以使用ConstantObjectInspectors获取作为参数传递的常量值。在GenericUDA或.NET中的GenericUDF或init()的initialize()方法中,检查指定的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_maxhttp://github.com/klout/brickhouse),其中会收集前N个键和最大值。