Cassandra SelectQuery根据秒数检索每分钟的第一条记录

Cassandra SelectQuery根据秒数检索每分钟的第一条记录,cassandra,cql,Cassandra,Cql,有人能告诉我如何编写select查询来返回每分钟的第一条记录吗? 这里的第一条记录是指每分钟的第一条记录(以秒为单位)。请参见下面的示例。 我的系统将每隔5秒定期从设备接收数据。 我的桌子结构是这样的 CREATE TABLE device ( deviceId text, datetime timestamp, temp float, volt float, PRIMARY KEY (deviceId, datetime) ) WITH CLUSTERI

有人能告诉我如何编写select查询来返回每分钟的第一条记录吗? 这里的第一条记录是指每分钟的第一条记录(以秒为单位)。请参见下面的示例。 我的系统将每隔5秒定期从设备接收数据。 我的桌子结构是这样的

CREATE TABLE device (
    deviceId text,
    datetime timestamp,
    temp float,
    volt float,
    PRIMARY KEY (deviceId, datetime)
) WITH CLUSTERING ORDER BY (datetime DESC);
是否可以在select查询中提取日期时间,对其进行处理并找到每分钟的第一条记录

insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:10:00+0000',0.12,6.7);
insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:10:05+0000',3.12,61.7);
insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:10:10+0000',2.12,16.7);
insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:10:15+0000',1.12,26.7);

insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:11:20+0000',4.12,11.7);
insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:11:25+0000',5.12,12.7);
insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:11:30+0000',6.12,23.7);
insert into device (deviceId,datetime,temp,volt)
values ('device123','2018-10-10 5:11:35+0000',7.12,126.7);
我的查询结果应该是这样的:

aploetz@cqlsh:stackoverflow> SELECT * FROM device_by_minute
    WHERE deviceid='device123'
      AND minute_bucket IN ('2018-10-10 05:10','2018-10-10 05:11')
    PER PARTITION LIMIT 1;

 deviceid  | minute_bucket    | datetime                        | temp | volt
-----------+------------------+---------------------------------+------+------
 device123 | 2018-10-10 05:10 | 2018-10-10 05:10:00.000000+0000 | 0.12 |  6.7
 device123 | 2018-10-10 05:11 | 2018-10-10 05:11:20.000000+0000 | 4.12 | 11.7

(2 rows)
  • 第10分钟,秒=00,温度=0.12,电压=6.7
  • 第11分钟,秒=20,温度=4.12,电压=11.7

您能否提供一些建议,说明我如何在cassandra中实现这一点?

在cassandra中,您通常必须构建表以适应您的查询模式。因此,您可以使用上面的模型构建一个表,该表只包含每分钟数据的第一个条目

或者,您可以构建一个表,以按分钟对数据进行分区。在这种情况下,您需要向表中添加一个分区键,
minute\u bucket
。此外,要每分钟回拉“第一”(或最早)行,请将
datetime
集群键上的排序方向翻转到升序(
ASC
)。例:

然后(加载数据后),使用
每分区限制
子句运行多键查询,如下所示:

aploetz@cqlsh:stackoverflow> SELECT * FROM device_by_minute
    WHERE deviceid='device123'
      AND minute_bucket IN ('2018-10-10 05:10','2018-10-10 05:11')
    PER PARTITION LIMIT 1;

 deviceid  | minute_bucket    | datetime                        | temp | volt
-----------+------------------+---------------------------------+------+------
 device123 | 2018-10-10 05:10 | 2018-10-10 05:10:00.000000+0000 | 0.12 |  6.7
 device123 | 2018-10-10 05:11 | 2018-10-10 05:11:20.000000+0000 | 4.12 | 11.7

(2 rows)
注:

  • 在分区键的一部分使用
    IN
    子句进行这样的多键查询将阻止Cassandra在查询时找出哪个节点包含数据。然后,它将指定一个“协调器节点”来处理结果集编译,以及与包含请求的副本的节点的通信。相对于对完整分区键的查询,这不会执行得很好
  • 这个查询可以通过运行
    SELECT*fromdevice\u来简化,每分区限制1分钟。但是,随着数据集的增长,查询性能将变得更差。最好限制
    WHERE
    子句中的潜在结果集
  • 我会将子句中的
    中的数字项保持在低个位数