卡桑德拉时间范围查询

时间:2015-04-02 04:39:04

标签: cassandra cql cql3

在你投票之前,我想说明我看过所有类似的问题,但我仍然感到害怕,并且#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 <= ?;

我真的被这个困住了。谁能告诉我我做错了什么?

谢谢, 德尼兹

3 个答案:

答案 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