我有一个以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点之间max
的x_power_mw
值是多少,它何时发生?”“并且在上面的查询中,如果要查询2011年和2015年而不是2011年到2015年(不连续的值),该怎么办”
对我来说,似乎无法为这些查询编写单个cql
查询。1)如何用2011年和2015年而不是2011年到2015年的cql
子句编写where
查询?
2)每年分别查询并在客户端计算最大值是否是一个好主意?
3)我的data model
对这些查询是否正确(如果不正确)(我应该将年与要添加为复合聚类键的日期分开)吗?
因为在您的情况下,您有date
作为分区键,所以您需要生成2011-2015年1月所有日期的所有可能值,并并行执行查询(不建议使用IN
on the partition key,因为它将使协调节点过载。在您的情况下,您将执行155个查询。
您可以在查询中使用max
来查找给定的值,尽管获取关联的时间戳会更加棘手(也许您可以使用用户定义的函数来返回最大/时间戳的元组)。但是可以在客户端执行过滤,因为您只传输120个值(每分钟1个)。
理论上,您可以使用year作为分区键,并使用timestamp
而不是time
进行群集列,但是在这种情况下,每个分区将获得约50万个单元格,超过建议的最大值100k /分区。您仍然可以使用日期,但将其截断为月份,因此每个分区将获得约4.5万个单元格,并继续使用timestamp
作为群集列。但这可能不利于每天仅选择特定范围。