我使用的是Cassandra 2.2.0,我已经阅读了using Counter type,但它并没有提供太多细节。
有没有办法在Cassandra的Counter类型列上聚合,类似于以下内容?
SELECT sum(my_counter_column) FROM my_table ;
以上查询导致此错误:
InvalidRequest: code=2200 [Invalid query] message="Invalid call to
function sum, none of its type signatures match (known type
signatures: system.sum : (tinyint) -> tinyint, system.sum : (smallint)
-> smallint, system.sum : (int) -> int, system.sum : (bigint) -> bigint,
system.sum : (float) -> float, system.sum : (double) ->
double, system.sum : (decimal) -> decimal, system.sum : (varint) ->
varint)"
我知道我可以获取所有数据,然后在客户端进行聚合,但我只是想知道它是否可以在Cassandra中完成。非常感谢。
答案 0 :(得分:2)
在实施系统sum()
功能时看起来像是一种疏忽。您应该为2.2.x和3.x为它here输入一张jira票,以便它可以修复。
与此同时,您可以通过定义自己的用户定义聚合函数(在Cassandra 2.2及更高版本中)来解决此问题,如下所示:
CREATE FUNCTION agg_counter ( state bigint, val counter )
CALLED ON NULL INPUT
RETURNS bigint
LANGUAGE java
AS '
if (val != null)
state = state + val;
return state;
';
CREATE AGGREGATE sum_counter ( counter )
SFUNC agg_counter
STYPE bigint
INITCOND 0;
然后你会像这样使用它:
SELECT sum_counter(countercol) FROM table WHERE partition=1;
我在3.0.0-beta2中尝试了它,它可以工作。它也应该在2.2中工作。
在尝试创建函数之前,请记住在cassandra.yaml中设置enable_user_defined_functions: true
。