Cassandra CQL查询检查多个值

时间:2013-10-07 18:16:01

标签: cassandra cql3

如何使用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还不够成熟,对查询的支持很差,还是我必须改变思维方式呢?

2 个答案:

答案 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,..),否则会引发错误。