2013-07-18 52 views
7

我想通过CQL3中的行键以外的组合键查询数据过滤。 这是我的查询:使用组合键(Cassandra中的行键)以外的查询

CREATE TABLE grades (id int, 
    date timestamp, 
    subject text, 
    status text, 
    PRIMARY KEY (id, subject, status, date) 
); 

当我试图访问数据,

SELECT * FROM grades where id = 1098; //works fine 
SELECT * FROM grades where subject = 'English' ALLOW FILTERING; //works fine 
SELECT * FROM grades where status = 'Active' ALLOW FILTERING; //gives an error 

请求无效:PRIMARY KEY一部分的地位不被限制(前面部分主题是要么不限制或由非EQ 关系)

只是为了试验,我shuf逃离密钥,始终保持'id'作为我的Primary Row Key。考虑上面的例子,如果我在主键列表中交换主题和状态,我总是只能够使用主键行或第二个键进行查询,然后我可以使用状态进行查询,但是如果我尝试通过查询获得类似的错误主题或时间。

我做错了什么?我可以不使用CQL3中的任何其他组合键来查询数据吗? 我使用Cassandra 1.2.6和CQL3。

回答

12

根据Cassandra Composite Key模型(http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT),这看起来是所有正常行为。 Cassandra数据模型的目的在于授予查询性能,这意味着在存储和索引数据的方式上存在“限制”,然后如何查询它,即您的数据,这是一种普遍的NoSQL思维方式主键“总是需要限制主题的前面部分”。

您不能在查询的主键列表上交换元素(这更像是一种SQL思维方式)。如果要使用组合键的多个元素,则始终需要“约束”/“限制”主键的前一个元素。这意味着如果你有组合键=(id,主题,状态,日期)并且想要查询“状态”,你需要限制“id”和/或“主题”(如果你使用“ “允许过滤”,即只能限制“主题”,不需要限制“ID”)。所以,如果你想查询“状态”,你将能够以两种不同的方式查询:

select * from grades where id ='1093'and subject ='English'and status ='Active' ;

或者

SELECT * FROM等级,其中主体= '英语' 和状态= '活动' 允许过滤;

第一个针对特定的“学生”,第二个针对所有关于该主题的“学生”,状态=“有效”。

+0

不错的解释! –

+0

明白了!谢谢,现在对我来说更有意义。我想我会重新遍历我的查询,看看我想如何构建它们,因为我可能并不总是需要限制主题能够获得状态。 – user988544

+0

帮助我很多!谢谢 – kn0x