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
。
我使用的是 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
。