【问题标题】:retrieving data from cassandra database从 cassandra 数据库中检索数据
【发布时间】:2017-05-21 01:27:35
【问题描述】:

我正在处理存储在 Cassandra 数据库中的智能停车数据,并且正在尝试获取每个设备的最后状态。 我正在研究自制数据集。 这是表的描述。 table description

select * from parking.meters

需要帮助!

【问题讨论】:

  • 不清楚你要求什么,不清楚什么不起作用......

标签: cassandra cql cqlsh


【解决方案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)

【讨论】:

  • 感谢您的回复,我正在使用 cassandra 3.0.9。
猜你喜欢
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2012-03-12
  • 2021-02-11
相关资源
最近更新 更多