我如何 select cassandra 中聚类列的所有行?

How do I select all rows for a clustering column in cassandra?

我有一个分区密钥:A

集群列:B、C

我明白我可以这样查询

Select * from table where A = ?
Select * from table where A = ? and B = ?
Select * from table where A = ? and B = ? and C = ?

在某些情况下,我希望 B 值是该列中的任何值。

有没有办法像下面这样查询?

Select * from table where A = ? and B = 'any value' and C = ?

选项 1:

在 Cassandra 中,您应该设计适合您的查询的数据模型。因此,支持第四个查询(通过 A 和 C 查询,但不一定知道 B 值)的正确方法是创建一个新的 table 来处理该特定查询。 table 几乎相同,只是 CLUSTERING COLUMNS 的顺序略有不同:

PRIMARY KEY (A, C, B)

现在这个查询可以工作了:

Select * from table where A = ? and C = ? 

选项 2:

或者,您可以创建具有不同集群顺序的实体化视图。现在 Cassandra 将使 MV 与您的 table 数据保持同步。

create materialized view mv_acbd as 
select A, B, C, D 
from TABLE1 
where A is not null and B is not null and C is not null  
primary key (A, C, B);

现在针对此 MV 的查询将非常有效

Select * from mv_acbd where A = ? and C = ? 

选项 3:

不是最好的,但您可以将以下查询与您的 table 一起使用

Select * from table where A = ? and C = ? ALLOW FILTERING

依赖 ALLOW FILTERING 从来都不是一个好主意,当然也不应该在生产集群中这样做。对于这种特殊情况,扫描在同一个分区内,性能可能会有所不同,具体取决于您的用例每个分区的聚类列数的比率。