如何使用Cassandra CQL查询检查非主键字段的值是“A”还是“B”? (我正在使用Cassandra 2.0.1)
以下是表格定义:
CREATE TABLE my_table (
my_field text,
my_field2 text,
PRIMARY KEY (my_field)
);
我试过了:
1> SELECT * FROM my_table WHERE my_field2 IN ('A', 'B');
2> SELECT * FROM my_table WHERE my_field2 = 'A' OR my_field = 'B' ;
第一个失败了这个消息:
Bad Request: IN predicates on non-primary-key columns (my_field2) is not yet supported
第二个失败是因为Cassandra CQL不支持OR关键字
我无法让这个简单的查询工作(以非常直接的方式)。一般来说,我很沮丧地处理CQL查询。是因为Cassandra还不够成熟,对查询的支持很差,还是我必须改变思维方式呢?
答案 0 :(得分:8)
这是cassandra的故意功能。您不能在非
的列上使用WHERE子句进行查询这是因为您的数据是围绕一系列cassandra节点进行分区的。您希望避免让整个响铃返回您的查询的答案。理想情况下,您希望能够从环中的单个节点检索数据
通常在cassandra中,您希望构建表以匹配您的查询而不是关系规范化。所以你有几个选择来解决这个问题。
1)将您的数据写入多个表以支持各种查询。在您的情况下,您可能想要创建第二个表作为
CREATE TABLE my_table (
my_field2 text,
my_field text,
PRIMARY KEY (my_field2)
);
然后您的第一个查询将正确返回
2)使用复合键创建表格
CREATE TABLE my_table (
my_field text,
my_field2 text,
PRIMARY KEY (my_field, my_field2)
);
使用此方法,如果您没有为my_field指定查询值,则需要使用限定符附加查询以告诉cassandra您确实要查询整个环
SELECT * FROM my_table WHERE my_field2 IN ('A', 'B') ALLOW FILTERING;
-edit -
您无法使用辅助索引来搜索多个值。每个CQL文档
http://www.datastax.com/documentation/cql/3.0/webhelp/cql/ddl/ddl_primary_index_c.html
“索引是一种数据结构,允许快速,有效地查找与给定条件匹配的数据。”
所以,你必须给它一个且只有一个值。
答案 1 :(得分:-1)
如果你想使用'my_field2'作为过滤器,你必须在'my_field2'上创建索引
示例:
Create index IndexName on KeyspaceName.TableName(ColumnName);
CREATE INDEX indexOnField2 ON my_table(my_field2)
之后你可以按my_field2过滤:
示例:
SELECT * FROM my_table WHERE my_field2='ANYTHING THAT YOU WANT'
注意:在过滤期间请注意您的列类型(int,text,..),否则会引发错误。