10

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

4

2 回答 2

9

这是 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;

-编辑-

您不能使用二级索引来搜索多个值。根据 CQL 文档

http://www.datastax.com/documentation/cql/3.0/webhelp/cql/ddl/ddl_primary_index_c.html

“索引是一种数据结构,可以快速、高效地查找与给定条件匹配的数据。”

所以,你必须给它一个且只有一个值。

于 2013-10-07T20:32:20.120 回答
-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,..),否则会引发错误。

于 2018-04-18T06:48:59.133 回答