Cassandra SelectQuery根据秒数检索每分钟的第一条记录
有人能告诉我如何编写select查询来返回每分钟的第一条记录吗? 这里的第一条记录是指每分钟的第一条记录(以秒为单位)。请参见下面的示例。 我的系统将每隔5秒定期从设备接收数据。 我的桌子结构是这样的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
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)
注:
- 在分区键的一部分使用
子句进行这样的多键查询将阻止Cassandra在查询时找出哪个节点包含数据。然后,它将指定一个“协调器节点”来处理结果集编译,以及与包含请求的副本的节点的通信。相对于对完整分区键的查询,这不会执行得很好IN
- 这个查询可以通过运行
SELECT*fromdevice\u来简化,每分区限制1分钟代码>。但是,随着数据集的增长,查询性能将变得更差。最好限制
子句中的潜在结果集WHERE
- 我会将子句中的
中的数字项保持在低个位数