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