在你投票之前,我想说明我看过所有类似的问题,但我仍然感到害怕,并且#34; PRIMARY KEY专栏不能受到限制"错误。
这是我的桌面结构:
CREATE TABLE IF NOT EXISTS events (
id text,
name text,
start_time timestamp,
end_time timestamp,
parameters blob,
PRIMARY KEY (id, name, start_time, end_time)
);
以下是我要执行的查询:
SELECT * FROM events WHERE name = ? AND start_time >= ? AND end_time <= ?;
我真的被这个困住了。谁能告诉我我做错了什么?
谢谢, 德尼兹
答案 0 :(得分:1)
要运行查询,请使用ALLOW FILTERING子句
SELECT * FROM analytics.events WHERE name = ? AND start_time >= ? AND end_time <= ? ALLOW FILTERING;
答案 1 :(得分:1)
这是您需要重新构建数据或使用分布式分析平台(如spark)的查询。 Id描述了数据如何通过数据库分发。由于未在此查询中指定,因此需要使用全表扫描来确定必要的行。 Cassandra设计团队已经决定,他们宁愿你根本不做查询,而不是做一个无法扩展的查询。
基本上每当您看到“COLUMN无法限制”时,这意味着您尝试执行的查询无法在您创建的表格上高效完成。
答案 2 :(得分:0)
要进行查询的“常规”rule是您必须至少传递所有分区键列,然后您可以按照它们设置的顺序添加每个键。“所以为了让您做到这一点你需要在那里添加where id = x
。
但是,此错误消息暗示的是,一旦您选择'start_time&gt; 34'那就是“在链条下面”,你被允许去,否则它将需要“可能太昂贵”的ALLOW FILTERING
标志。因此,它必须在单个列上“仅平等”到一个< >
组合。一切都以速度为名。这有效(虽然不提供范围查询):
SELECT * FROM events WHERE name = 'a' AND start_time = 33 and end_time <= 34 and id = '35';
如果您正在寻找“在y分钟时发生的事件”,则可能会有不同的数据模型,例如为事件正在进行或不进行事件的每一分钟添加事件,或根据“hour进行分组“或者不是。另请参阅https://stackoverflow.com/a/48755855/32453