Тип агрегирующего набора в Кассандре - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь объединить строки, каждая из которых содержит столбец Set.Я хотел бы, чтобы результат содержал сумму всех множеств, где нуль был бы эквивалентен пустому множеству.Я ожидал, что такой запрос: «выберите сумму (my_set_column) из группы my_table my_key_column», чтобы сделать это, но тип набора не поддерживается этим агрегатом.Кто-нибудь знает способ агрегировать это с помощью существующих встроенных кассандры?Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я смог сделать эту работу со следующими UDF / UDA.Это можно рассматривать как агрегатор множеств общего назначения, если кому-то еще это понадобится в будущем:

CREATE OR REPLACE FUNCTION agg_set_func(state tuple<int, set<bigint>>, val set<bigint>) CALLED ON NULL INPUT RETURNS tuple<int, set<bigint>> LANGUAGE java AS 
$$
    if (val == null) {
        return state;
    }
    Set<Long> s = state.getSet(1, Long.class);
    s.addAll(val);
    state.setSet(1, s);
    return state;
$$;

CREATE OR REPLACE FUNCTION agg_set_func_final(state tuple<int, set<bigint>>) CALLED ON NULL INPUT RETURNS set<bigint> LANGUAGE java AS 
$$
    return state.getSet(1, Long.class);
$$;

CREATE AGGREGATE agg_set(set<bigint>) 
SFUNC agg_set_func
STYPE tuple<int, set<bigint>>
FINALFUNC agg_set_func_final
INITCOND (0,{});
0 голосов
/ 23 октября 2018

Вы должны написать udf (сумма для одного набора) или uda (сумма для нескольких наборов), но это должно быть довольно просто.Что-то вроде

CREATE FUNCTION set_sum(values set<int>)
CALLED ON NULL INPUT
RETURNS int
LANGUAGE java
AS $$
  if (values == null)
    return 0;

  int total = 0;
  for (int v : values)
    total += v;
  return total;
$$;

Тогда SELECT set_sum(value_column) FROM my_table WHERE id = 'key'; агрегирует значения заданного столбца в каждой строке.Если вы хотите объединить несколько строк (то есть с group by), вам нужно использовать UDA, который может использовать вышеуказанную функцию с состоянием int для замены total вместо того, чтобы начинаться с 0 каждый раз.

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