如何为 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_mwmax 值是多少,何时发生” “在上面的查询中,如果我想查询 2011 年和 2015 年而不是 2011 年到 2015 年(不连续值)怎么办?”

对我来说,为这些查询编写单个 cql 查询似乎是不可能的。 1) 如何编写带有where 子句的cql 查询,其年份为2011 年和2015 年而不是2011 年至2015 年?

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

3) 我的data model 对于这些查询是否正确,如果不是正确的(我应该将年份与日期分开以添加为复合集群键)?

【问题讨论】:

【参考方案1】:

    因为在您的情况下,您有一个 date 作为分区键,您需要生成 2011-2015 年 1 月所有天的所有可能值,并并行执行查询(不是建议在分区键上使用IN,因为它会使协调节点过载)。在您的情况下,您将执行 155 个查询。

    1234563 .但是可以在客户端执行过滤,因为您只传输 120 个值(每分钟 1 个)。

    理论上,您可以使用年份作为分区键并使用 timestamp 而不是 time 作为集群列,但在这种情况下,每个分区将获得约 50 万个单元格,高于建议的最大值 100k /划分。您仍然可以使用日期,但将其截断为月份,因此每个分区将获得约 45k 单元格,并继续使用 timestamp 作为聚类列。但它可能无助于每天只选择特定范围。

【讨论】:

以上是关于如何为 where 子句中的列编写具有不连续值的 Cassandra 查询的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - IN 子句

使用子查询添加具有不同 where 子句的列

Mysql设计索引的原则

如何为'where'子句中的项目返回一些默认值,这些项目在数据库表列中不匹配(不存在)

如何为 Oracle 中的列组合赋予唯一约束?

Bigquery:选择具有不在group by子句中的任何值的列