2016-02-09 2 views
1

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

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

CREATE OR REPLACE FUNCTION testFunc (валь междунар, вход ИНТ)

ПРИЗВАЛ NULL INPUT вОЗВРАЩЕНИЯ INT

ЯЗЫК Java AS 'возврата VAL * ввода;';

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

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

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

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

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

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

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

ответ

1

Calling, UDF таким образом testFunc(int_column, 3) такой же, как Пасси ng a 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 столбец в таблицу.

+0

спасибо за ваш ответ. Я искал что-то, что может измениться при каждом вызове, например, один раз вызвать функцию, чтобы умножить на 3, один раз умножить на 5 и так далее, в зависимости от потребностей пользователя, без необходимости писать функцию для каждого дело. – drstein

+0

В этом случае (например, множитель переменной) обрабатывает его на уровне приложения. Я не думаю, что CQL предоставляет такое средство. Если вы хотите, чтобы SPARK-SQL мог работать в этом сценарии. –

Смежные вопросы