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