我是Cassandra的新手,在Cassandra中创建了一个表,如下所示:
CREATE TABLE HAS.HASDDDB (
Current float,
Time timestamp,
PRIMARY KEY (Current, Time)
);
应用程序按如下方式向表插入数据:
INSERT INTO HAS.HASDDDB ( Current, Time )
VALUES ( 0.01, Dateof ( NOW ( ) ) );
我需要对过去一小时的所有电流值求和。在MYSQL中,我可以这样做:
select sum(Current) from DDDB where UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(Time)<=3600
我知道cassandra不支持SUM这样的聚合函数。是否有可能达到同样的效果使用计数器,因为我在一些帖子读?如果不是,我怎么在卡桑德拉做这个?
我也有困难检索基于一个时间范围的数据,例如返回所有记录从最后一个小时或一天到现在。在Cassandra中,我如何执行像
这样的语句?SELECT * FROM HASDDDB
WHERE current = 0.00 and Time > unixTimestampof ( now ( ) -3600) AND Time < unixTimestampof ( now ( ) );
这是给我一个错误,我想得到的结果,例如,直到现在,从最后一个小时,就像在MYSQL。
我试过这个帖子,但它没有帮助。
不幸的是,像sum和average这样的基本函数还没有内置到Cassandra中,但是在Cassandra 2.2及以后的版本中有一个新特性,就是能够定义像sum这样的聚合函数。因此,只需一点点努力,您就可以创建自己的和函数,它将在协调器节点上运行。这里有一些创建聚合函数的例子。
如果您想按小时对数据求和,那么将"hour"作为分区键会更容易,然后您可以对分区中的所有内容求和,而无需进行范围查询。
使用"current"作为分区键没有多大意义,因为分区中的所有行都具有相同的当前值,然后您不妨获取count(*)并将其乘以当前值以获得总和。
按时间戳查询,通常使用如下格式:
ts >= '2015-08-01 18:00:00' and ts < '2015-08-01 19:00:00