Реализация эскизов в Кассандре с использованием UDF и UDA - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь реализовать 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"

Может ли государство быть просто набором, картой или списком?

1 Ответ

1 голос
/ 29 апреля 2020

CQL не разрешает подзапросы.

Возможно, вам придется пересмотреть подход здесь. Вероятно, гораздо больше смысла тратить время на разработку этого приложения, чем на Cassandra.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...