Cassandra中的集合集类型

时间:2018-10-23 14:47:39

标签: cassandra

我正在尝试汇总每个包含Set列的行。我希望结果包含所有集合的总和,其中null等于空集合。我期望这样的查询:“通过my_key_column从my_table组中选择sum(my_set_column)”,但是此聚合不支持集合类型。有谁知道使用现有的cassandra内置插件聚合此方法的方法?谢谢!

2 个答案:

答案 0 :(得分:2)

您必须编写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';将汇总每一行中set列的值。如果要合并多行(即使用分组依据),则需要使用UDA,该UDA可以将上述函数与int状态一起使用来代替total,而不是每次都从0开始。

答案 1 :(得分:0)

我能够使用以下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,{});