Cassandra使用unixtimestampof()的时间范围检索数据

时间:2015-08-04 08:39:35

标签: cassandra cql

我是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做到这一点?

我也无法根据时间范围检索数据,例如返回从过去一小时或一天到现在的所有记录。在Cassandra中,我如何执行类似

的语句
SELECT * FROM HASDDDB
WHERE current = 0.00 and Time > unixTimestampof ( now ( ) -3600)  AND Time < unixTimestampof ( now ( ) );

这给了我一个错误。我想从最后一小时得到结果,就像在MYSQL中一样。

我试过这个post,但没有用。

1 个答案:

答案 0 :(得分:0)

不幸的是,总和和平均等基本函数还没有构建到Cassandra中,但Cassandra 2.2及更高版本中的一个新功能是能够定义像sum这样的聚合函数。因此,只需稍加努力,您就可以创建自己的sum函数,该函数将在协调器节点上运行。请参阅创建聚合函数here的一些示例。

如果要按小时对数据求和,将“小时”作为分区键更容易,然后在不需要范围查询的情况下对分区中的所有内容求和。

使用“current”作为分区键没有多大意义,因为分区中的所有行都具有相同的当前值,然后您可能只需获取count(*)并将其乘以当前值得到总和。

要按时间戳查询,您通常会使用以下格式:

ts >= '2015-08-01 18:00:00' and ts < '2015-08-01 19:00:00