我有一个Cassandra表,其创建方式如下:
CREATE TABLE table(
num int,
part_key int,
val1 int,
val2 float,
val3 text,
...,
PRIMARY KEY((part_key), num)
);
每个记录的part_key为1,因为我想执行范围查询而只有一个服务器(我知道这不是一个好的用例)。 num是从1到1.000.000的记录号。我已经可以运行像
这样的查询了SELECT num, val43 FROM table WHERE part_key=1 and num<5000;
是否可以在Cassandra中进行更多过滤,例如:
... AND val45>463;
我认为不可能这样,但有人可以解释原因吗? 现在我在我的代码中进行过滤,但还有其他可能吗?
我希望我没有错过已经解释过的帖子。
感谢您的帮助!
答案 0 :(得分:1)
Cassandra范围查询只能在查询指定的最后一个聚类列上进行。所以,如果你的pk是(a,b,c,d),你可以做到
... where a=2, b=4, c>5
... where a=2, b>4
但不是
...其中a = 2,c> 5
这是因为数据存储在分区中,按分区键(pk的第一个键)进行索引,然后按每个连续的聚类键进行排序。
如果您有准确的值,可以将第二个索引添加到val 4,然后执行
... and val4=34
但就是这样。即使这样,您也希望在应用索引之前点击分区。否则,您将获得一个可能超时的群集范围的查询。
由于cassandra存储快速插入和检索数据的方式,因此存在查询限制。分区中的所有数据都保存在一起,因此在分区客户端内查询通常不是问题,除非您有非常大的行(在这种情况下,可能应该检查模式)。
希望有所帮助。