使用CQL中的元组操作切片分区行

时间:2015-06-20 10:44:58

标签: cassandra cql datastax

我试图通过聚类键来理解元组运算符的行为。这就是我想要做的事情:

create table sampletable (a int,b int,c int, d int, e int, primary key((a,b,c),d,e));
insert into sampletable(a,b,c,d,e) values(1,1,1,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,1,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,1,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,1);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,2);
insert into sampletable(a,b,c,d,e) values(1,1,2,2,3);
insert into sampletable(a,b,c,d,e) values(1,1,2,1,2); 
insert into sampletable(a,b,c,d,e) values(1,1,1,2,3);

cqlsh:mapro> select * from sampletable;

 a | b | c | d | e
---+---+---+---+---
 1 | 1 | 1 | 1 | 1
 1 | 1 | 1 | 1 | 2
 1 | 1 | 1 | 2 | 3
 1 | 1 | 2 | 1 | 1
 1 | 1 | 2 | 1 | 2
 1 | 1 | 2 | 2 | 3

(6 rows)

-- Query1
cqlsh:mapro> select * from sampletable where a=1 and b=1 and c in (1,2) and (d,e)<(2,3);  
 a | b | c | d | e                                                                 
---+---+---+---+---                                                                
 1 | 1 | 1 | 1 | 1                                                                 
 1 | 1 | 1 | 1 | 2                                                                 
 1 | 1 | 2 | 1 | 1                                                                 
 1 | 1 | 2 | 1 | 2                                                                                                                                              
(4 rows)            


-- Query2
cqlsh:mapro> select * from sampletable where a=1 and b=1 and c in (1,2) and (d,e)<(2,9);                                                  
 a | b | c | d | e                                                                 
---+---+---+---+---                                                                
 1 | 1 | 1 | 1 | 1                                                                 
 1 | 1 | 1 | 1 | 2                                                                 
 1 | 1 | 1 | 2 | 3                                                                 
 1 | 1 | 2 | 1 | 1                                                                 
 1 | 1 | 2 | 1 | 2                                                                 
 1 | 1 | 2 | 2 | 3                                                                                                                                              
(6 rows)

我无法理解为什么查询2与查询1相比返回不同的结果。我的理解是Cassandra将首先应用所有分区密钥过滤,然后尝试应用元组排序,即(d,e)&lt; (2,3)将作为d <2应用,并且在结果的基础上,它将应用e <3。我理解错了吗?请帮忙。

1 个答案:

答案 0 :(得分:3)

如果是群集列,(a1, a2) < (b1, b2)在以下任何一种情况下都可以为真:

1) a1 < b1 
2) a1=b1 and a2 < b2

这就是Cassandra在内部基于聚类列

进行排序的方式

基于此,查询1和2的结果符合预期。