我想编写一个可以接受常量参数的自定义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个键和最大值。