Cassandra 计数器类型的总和

aggregate sum on Counter type of Cassandra

我使用的是 Cassandra 2.2.0,我已经阅读 using Counter type 但它没有提供太多细节。

有没有办法在 Cassandra 的计数器类型列上进行聚合,类似于以下内容?

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 中完成。非常感谢。

看起来像是实施系统 sum() 功能时的疏忽。您可能应该为它输入一个 jira 票证 here 2.2.x 和 3.x 以便修复它。

同时,您可以像这样定义自己的用户定义聚合函数(在 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