如何为 where 子句中的列编写具有不连续值的 Cassandra 查询
Posted
技术标签:
【中文标题】如何为 where 子句中的列编写具有不连续值的 Cassandra 查询【英文标题】:How to write Cassandra query with discontinuous values for a column in the where clause 【发布时间】:2020-05-13 19:48:20 【问题描述】:我有几年间隔 1 分钟的 power_drawl 时间序列数据。也就是说,每天将有 1440 个(60 分钟 * 24 小时)值。
这是我的桌子,
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 点之间,x_power_mw
的 max
值是多少,何时发生”
“在上面的查询中,如果我想查询 2011 年和 2015 年而不是 2011 年到 2015 年(不连续值)怎么办?”
对我来说,为这些查询编写单个 cql
查询似乎是不可能的。
1) 如何编写带有where
子句的cql
查询,其年份为2011 年和2015 年而不是2011 年至2015 年?
2) 每年分别查询并在客户端计算最大值是个好主意吗?
3) 我的data model
对于这些查询是否正确,如果不是正确的(我应该将年份与日期分开以添加为复合集群键)?
【问题讨论】:
【参考方案1】:因为在您的情况下,您有一个 date
作为分区键,您需要生成 2011-2015 年 1 月所有天的所有可能值,并并行执行查询(不是建议在分区键上使用IN
,因为它会使协调节点过载)。在您的情况下,您将执行 155 个查询。
理论上,您可以使用年份作为分区键并使用 timestamp
而不是 time
作为集群列,但在这种情况下,每个分区将获得约 50 万个单元格,高于建议的最大值 100k /划分。您仍然可以使用日期,但将其截断为月份,因此每个分区将获得约 45k 单元格,并继续使用 timestamp
作为聚类列。但它可能无助于每天只选择特定范围。
【讨论】:
以上是关于如何为 where 子句中的列编写具有不连续值的 Cassandra 查询的主要内容,如果未能解决你的问题,请参考以下文章