Cassandra cqlsh无法使用非分区键的where子句

时间:2017-04-12 10:32:04

标签: cassandra cql cqlsh

我的表描述是:

CREATE TABLE user (
    id text,
    CustID int static,
    UpdateDate date,
    DateOfBirth date static,
    Gender text static,
    Address text static,
    City text static,
    State text static,
    Zip text static,
    Email  text static,
    Phone text static,
    OverallAssets double,
   PRIMARY KEY (id,UpdateDate)
); 
  
    

从用户中选择*工作正常。

         

从用户中选择*,其中分区键也正常工作。

  

但是,如果我在where子句中输入非分区键错误。可能是什么原因?

ReadFailure: Error from server: code=1300 [Replica(s) failed to execute 
read] message="Operation failed - received 0 responses and 1 failures" info=
{'failures': 1, 'received_responses': 0, 'required_responses': 1, 
'consistency': 'ONE'}

2 个答案:

答案 0 :(得分:2)

select * from user where CustID =0 allow filtering;

在Cassandra中,需要采用基于查询的建模方法。解决此问题的最佳方法是使用专门设计用于提供该查询的表

CREATE TABLE users_by_custid (
    id text,
    CustID int,
    UpdateDate date,
    DateOfBirth date static,
    Gender text static,
    Address text static,
    City text static,
    State text static,
    Zip text static,
    Email  text static,
    Phone text static,
    OverallAssets double,
   PRIMARY KEY (cust_id,id,UpdateDate)
); 

这将有效,它将很好地分发,并且不会要求ALLOW FILTERING附带的全表扫描。

  

是的我正在做cqlsh --connect-timeout=100000000 --request-timeout=10000000000

我不能警告你不要这样做。这些超时默认值存在是有原因的。它们可以防止您的群集/节点因执行错误的查询而导致翻倒。当您遇到问题并试图增加查询超时时,请仔细查看您的查询,看看是否有更好的方法来构建它。

答案 1 :(得分:1)

您正在使用allow filtering。小心。使用allow过滤执行此查询可能不是一个好主意,因为它可能会使用大量的计算资源,并且可能由于超时而无法返回任何结果。不要在生产中使用allow过滤阅读有关使用ALLOW FILTERING的数据文档文档

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/select_r.html?hl=allow,filter

而不是使用允许过滤创建物化视图或索引。

点击此链接,了解如何创建和使用实体化视图:https://www.datastax.com/dev/blog/new-in-cassandra-3-0-materialized-views

查看有关创建和使用索引的链接:http://docs.datastax.com/en/cql/3.1/cql/cql_reference/create_index_r.html

何时不使用索引
在这些情况下不要使用索引:

  • 在高基数列上,因为您随后会查询大量记录以获取少量结果。请参阅下面的使用高基数列索引的问题。
  • 在使用计数器列的表中 在经常更新或删除的列上。请参阅下面经常更新或删除的列中使用索引的问题。
  • 要查找大分区中的行,除非进行狭义查询。请参阅使用索引查找大型分区中的行的问题,除非在下面进行了简单的查询。

来源:http://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html