Cassandra计数器类型的总和

时间:2015-09-10 19:56:56

标签: database cassandra cql

我使用的是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中完成。非常感谢。

1 个答案:

答案 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