Я пытаюсь реализовать UDF в Кассандре, где я передаю параметр с количеством строк фактического запроса. UDF выглядит следующим образом:
CREATE OR REPLACE FUNCTION hashvalue(value text, size int)
RETURNS NULL ON NULL INPUT
RETURNS int
LANGUAGE java
AS
$$
return Math.abs(value.hashCode() % size);
$$;
Запрос должен выглядеть следующим образом:
SELECT name, hashvalues(name, (SELECT count(*) FROM test_table) AS hash) FROM test_table;
Я ожидаю что-то вроде:
name hash
text1 184
text2 932
text3 3
[...]
Я получил это ошибка:
SyntaxException: строка 1:25 нет жизнеспособной альтернативы при вводе 'SELECT' (хэш-значения SELECT (name, [(] SELECT ...)
Моя общая идея - отобразить все это в карте, и в конце я хотел бы преобразовать его через UDA в эскиз (например, Bloomfilter).
Возможно ли это как-то или я совершенно не прав? Спасибо
РЕДАКТИРОВАТЬ:
После вчерашнего комментария (еще раз спасибо) я снова попытался сохранить всю информацию эскиза в UDT. Это насколько я получил ...
CREATE TYPE bloomfilter_udt(
n_as_sample_size int,
m_as_number_of_buckets int,
p_as_next_prime_above_m bigint,
hash_for_string_coefficient_a list <bigint>,
hash_for_number_coefficients_a list <bigint>,
hash_for_number_coefficients_b list <bigint>,
bloom_filter_as_map map<int, int>
);
CREATE OR REPLACE FUNCTION bloomfilter_udf(state bloomfilter_udt, value text, sample_size int)
CALLED ON NULL INPUT
RETURNS bloomfilter_udt
LANGUAGE java
AS
$$
//put n_as_sample_size in result
//if(state.getUDTValue("n_as_sample_size") == null){state.setInt("n_as_sample_size", sample_size);};
//do some more stuff to the bloomfilter_udt
return state;
$$;
CREATE OR REPLACE AGGREGATE bloomfilter_uda(text, int)
SFUNC bloomfilter_udf
STYPE bloomfilter_udt
INITCOND {};
Основная проблема заключается в том, что, когда я хочу зарегистрировать UDA, я получаю следующую ошибку:
InvalidRequest: ошибка сервера: code = 2200 [Invalid query] message = "Неверный набор литералов для (фиктивного) типа bloomfilter_udt"
Может ли государство быть просто набором, картой или списком?