我想编写一个可以接受常量参数的自定义UDF(UDAF / UDTF)。
例如,我想写一个函数MAX(COL,i),其中COL是要找到最大值的值集合,而i是位置(即i = 1,找到最高,i = 2,找到第二高等等,这样Hive查询看起来像:
SELECT
MAX(value, 2)
FROM table;
这不仅仅适用于MAX,所以我需要一种能够做到这一点的一般方法,因此从排序的集合中排序和选择将不起作用。
答案 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_max
(http://github.com/klout/brickhouse),其中会收集前N个键和最大值。