Cassandra CQL 查询检查多个值

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

最佳答案

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

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

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

    关于Cassandra CQL 查询检查多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19231778/

    相关文章:

    mongodb - 关系数据库与列式数据库和文档数据库——它们不是一回事吗?

    cassandra - cassandra中二级索引的范围查询

    Cassandra 防止重复

    具有多个集合值的 Cassandra CQL where 子句?

    Cassandra 查询特定节点

    Cassandra 启动问题

    python - 在 pycassa 索引表达式中使用 OR

    cassandra - Cassandra-查询集群键

    Cassandra 数据建模 : Timestamp as partition keys

    Cassandra 数据建模 : Use a Map or have a lot of empty columns?