Cassandra错误:聚类列"域"不能被限制(前一列"时间戳"受非EQ关系限制)

时间:2017-05-03 22:10:01

标签: cassandra cql database nosql

我和Cassandra(cql)一起玩。当我做一个SELECT时,它返回一个错误:

  

群集栏"域"不能被限制(前一列"时间戳"受非EQ关系的限制)。

列"域" (类型varchar)和"时间戳" (类型时间戳)是主键。

我只过滤"时间戳"像这样:

SELECT id, comment, language, location, section, domain, type, user, timestamp 
    FROM comments WHERE ts >= ? AND  ts <= ? ALLOW FILTERING;

工作正常,但当我尝试过滤包括&#34;域&#34;给我那个错误:

SELECT id, comment, language, location, section, domain, type, user, timestamp 
    FROM comments WHERE domain=? AND ts >= ? AND  ts <= ? ALLOW FILTERING;

CREATE TABLE CQL:

CREATE TABLE table  ( 
id varchar,
type varchar,
section varchar,
comment text,
language varchar,
location text,
user int,
domain varchar,
timestamp timestamp,
PRIMARY KEY (id, timestamp, domain, user, section))
WITH CLUSTERING ORDER BY (timestamp DESC);

1 个答案:

答案 0 :(得分:0)

需要注意的重要事项,但是对于Cassandra,您需要采用以查询为中心的数据建模方法。基本上,如果这是您需要支持的查询:

SELECT id, comment, language, location, section, domain, type, user, timestamp 
    FROM comments WHERE domain=? AND timestamp >= ? AND  timestamp <= ?;

然后你的PRIMARY KEY应该被设计为支持:

PRIMARY KEY (domain, timestamp, user, section, id))

由于您不会在id上查询,因此将它作为分区键(PRIMARY KEY定义中最左侧的键)是没有意义的。但是你可能仍然希望它成为密钥的一部分,以帮助确保唯一性。

注意:

  • ALLOW FILTERING的查询性能很差,从不在生产系统上使用。
  • 此解决方案假设domainid的基数不是无限的(可能是)。为了超越分区上未绑定行增长的潜力,您可能希望通过将domain与其他内容合并来“抢占”您的分区键。