Улей 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-ключ и максимальные значения.

Другие вопросы по тегам