我正在处理存储在Cassandra数据库中的智能停车数据,我正在尝试获取每个设备的最新状态。 我正在研究自制的数据集。 这是表格的描述。 table description
需要帮助!
答案 0 :(得分:1)
尝试获取每个设备的最后状态
在Cassandra中,您需要根据查询模式设计表格。构建表格,填充数据,然后尝试满足查询要求是一种非常向后的方法。关键是,如果您确实需要满足该查询,那么您的表应该设计为提供从头开始查询 。
话虽这么说,仍然有办法让这项工作成功。您还没有提到您使用的是哪个版本的Cassandra,但如果您使用的是3.6+,则可以在SELECT上使用PER PARTITION LIMIT子句。
如果我构建表结构并插入一些行:
aploetz@cqlsh:stackoverflow> SELECT * FROM meters ;
parking_id | device_id | date | status
------------+-----------+----------------------+--------
1 | 20 | 2017-01-12T12:14:58Z | False
1 | 20 | 2017-01-10T09:11:51Z | True
1 | 20 | 2017-01-01T13:51:50Z | False
1 | 7 | 2017-01-13T01:20:02Z | False
1 | 7 | 2016-12-02T16:50:04Z | True
1 | 7 | 2016-11-24T23:38:31Z | False
1 | 19 | 2016-12-14T11:36:26Z | True
1 | 19 | 2016-11-22T15:15:23Z | False
(8 rows)
我认为你的PRIMARY KEY和CLUSTERING ORDER定义:
PRIMARY KEY ((parking_id, device_id), date, status)
) WITH CLUSTERING ORDER BY (date DESC, status ASC);
您至少按日期进行聚类(应该是实际的日期类型,而不是文本),这样就会以对您有所帮助的方式对您的行进行排序:
aploetz@cqlsh:stackoverflow> SELECT * FROM meters PER PARTITION LIMIT 1;
parking_id | device_id | date | status
------------+-----------+----------------------+--------
1 | 20 | 2017-01-12T12:14:58Z | False
1 | 7 | 2017-01-13T01:20:02Z | False
1 | 19 | 2016-12-14T11:36:26Z | True
(3 rows)