【问题标题】:Cassandra Error: Clustering column "domain" cannot be restricted (preceding column "timestamp" is restricted by a non-EQ relation)Cassandra 错误:无法限制聚类列“域”(前面的列“时间戳”受非 EQ 关系限制)
【发布时间】:2017-10-01 22:06:09
【问题描述】:

我在玩 Cassandra(cql)。当我执行 SELECT 时,它会返回一个错误:

不能限制聚类列“domain”(前面的列“timestamp”受非 EQ 关系限制)。

“domain”(varchar 类型)和“timestamp”(timestamp 类型)列是主键。

当我像这样只按“时间戳”过滤时:

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

工作正常,但是当我尝试过滤包括“域”时返回该错误:

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

创建表 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);

【问题讨论】:

  • 您是否看过 official documentation 关于 WHERE Cassandra 的限制?它明确指出,范围查询只能在 WHERE 子句的最后一部分,并且错误表明您正在以非受限方式使用ts。顺便说一下,错误是 Clustering column,您可能低估了表定义中的某些内容(例如,分区键、集群键)。贴出来看看……
  • 这是我的表定义。 CREATE TABLE table ( id varchar, type varchar, section varchar, comment text, language varchar, location text, user int, domain varchar,timestamp timestamp, PRIMARY KEY (id,timestampdomain,user,section)) WITH CLUSTERING ORDER BY (ts DESC);

标签: cassandra cql database nosql


【解决方案1】:

需要注意,但对于 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 与其他内容组合来“存储”您的分区键。

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 2018-08-23
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多