Улей UDF с параметрами
Я хочу написать пользовательский UDF (UDAF/UDTF), который может принимать постоянный параметр.
Например, я хочу написать функцию MAX(COL, i), где COL - это коллекция значений, чтобы найти максимальное значение, а i - это позиция (т.е. i = 1, найти самое высокое, i = 2, найти второе место и т. д.), такой что запрос Hive выглядит так:
SELECT
MAX(value, 2)
FROM table;
Это не только для MAX, поэтому мне нужен общий способ сделать это, поэтому сортировка и выбор из отсортированной коллекции не будут работать.
1 ответ
Вы можете использовать ConstantObjectInspectors для получения постоянных значений, передаваемых в качестве параметров. В вашем методе initialize() для GenericUDF или init() в GenericUDAFEvaluator проверьте, является ли указанный 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-ключ и максимальные значения.