如何在where子句中编写具有不连续值的Cassandra查询

问题描述 投票:0回答:1

我有一个以power_drawl为间隔的时间序列数据,持续了几年。也就是说,每天将有1440(60min * 24hr)个值。

这是我的桌子,

CREATE TABLE power_drawl (date date, time time, x_power_mw float, PRIMARY KEY(date, time)) WITH CLUSTERING ORDER BY (time ASC); 




SELECT * FROM power_drawl WHERE date='2016-01-01' and time>='00:00:00' and time<='00:10:00' ALLOW FILTERING ;   

 date       | time               | x_power_mw
------------+--------------------+--------------------------------
 2016-01-01 | 00:00:00.000000000 |                          23.95
 2016-01-01 | 00:01:00.000000000 |                          24.17
 2016-01-01 | 00:02:00.000000000 |                          23.52
 2016-01-01 | 00:03:00.000000000 |                          21.17
 2016-01-01 | 00:04:00.000000000 |                          24.53
 2016-01-01 | 00:05:00.000000000 |                          25.06
 2016-01-01 | 00:06:00.000000000 |                           28.5
 2016-01-01 | 00:07:00.000000000 |                          25.52
 2016-01-01 | 00:08:00.000000000 |                          25.66
 2016-01-01 | 00:09:00.000000000 |                           25.4
 2016-01-01 | 00:10:00.000000000 |                          23.25

现在我有这样的查询“ 2011年至2015年1月的每天中午12点至下午2点之间maxx_power_mw值是多少,它何时发生?”“并且在上面的查询中,如果要查询2011年和2015年而不是2011年到2015年(不连续的值),该怎么办”

对我来说,似乎无法为这些查询编写单个cql查询。1)如何用2011年和2015年而不是2011年到2015年的cql子句编写where查询?

2)每年分别查询并在客户端计算最大值是否是一个好主意?

3)我的data model对这些查询是否正确(如果不正确)(我应该将年与要添加为复合聚类键的日期分开)吗?

nosql datastax cassandra-3.0
1个回答
0
投票
  1. 因为在您的情况下,您有date作为分区键,所以您需要生成2011-2015年1月所有日期的所有可能值,并并行执行查询(不建议使用IN on the partition key,因为它将使协调节点过载。在您的情况下,您将执行155个查询。

  2. 您可以在查询中使用max来查找给定的值,尽管获取关联的时间戳会更加棘手(也许您可以使用用户定义的函数来返回最大/时间戳的元组)。但是可以在客户端执行过滤,因为您只传输120个值(每分钟1个)。

  3. 理论上,您可以使用year作为分区键,并使用timestamp而不是time进行群集列,但是在这种情况下,每个分区将获得约50万个单元格,超过建议的最大值100k /分区。您仍然可以使用日期,但将其截断为月份,因此每个分区将获得约4.5万个单元格,并继续使用timestamp作为群集列。但这可能不利于每天仅选择特定范围。

© www.soinside.com 2019 - 2024. All rights reserved.