Cassandra UDF и пользовательский ввод

Я использую Cassandra 2.2, и у меня проблема с пользовательскими функциями.

Я хочу создать функцию, которая принимает в качестве параметра целочисленный столбец таблицы и другое целое число в качестве пользовательского ввода и умножает два значения следующим образом:

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ testFunc (val int, input int)

ВЫЗЫВАЕТСЯ ПРИ ВОЗВРАЩЕНИИ НУЛЕВОГО ВВОДА int

ЯЗЫК java AS 'return val * input;';

Я могу выполнить функцию для двух целочисленных столбцов, например

выберите testFunc (int_column, another_int_column) из my_table;

и он работает, но когда я пытаюсь выполнить его с помощью пользовательского ввода, например:

выберите testFunc (int_column, 3) из my_table;

я получаю следующее исключение:

SyntaxException: ErrorMessage code = 2000 [Синтаксическая ошибка в запросе CQL] сообщение = строка 1:22 нет жизнеспособной альтернативы на входе '3' (выберите testFunc (год, [3] ...)

Можно ли добиться того, что я пытаюсь сделать, или я должен найти другой способ сделать это?


person drstein    schedule 09.02.2016    source источник


Ответы (1)


Вызов UDF таким образом testFunc(int_column, 3) аналогичен передаче int параметру функции, который принимает только String (т.е. имя столбца) и, следовательно, неверную синтаксическую ошибку no viable alternative at input '3'. Не уверен, вписывается ли это в ваш сценарий, но вы можете попробовать что-то вроде этого:

CREATE OR REPLACE FUNCTION testFunc (val int)

CALLED ON NULL INPUT RETURNS int

LANGUAGE java AS 'return val * 3;';

Или добавьте столбец multiplier в свою таблицу.

person Mayank Raghav    schedule 09.02.2016
comment
спасибо за ваш ответ, я искал что-то, что может меняться при каждом вызове, например вызов функции один раз для умножения на 3, один раз для умножения на 5 и так далее, в зависимости от потребностей пользователя, без необходимости писать функцию для каждого случая. - person drstein; 10.02.2016
comment
В этом случае (т.е. переменный множитель) обрабатывайте его на уровне приложения. Я не думаю, что CQL предоставляет такие возможности. Если вы хотите, SPARK-SQL может работать в этом сценарии. - person Mayank Raghav; 10.02.2016