【问题标题】:Cassandra time range queryCassandra时间范围查询
【发布时间】:2015-06-06 22:37:40
【问题描述】:

在您投反对票之前,我想声明,我查看了所有类似的问题,但我仍然收到可怕的“PRIMARY KEY column cannot be restricted”错误。

这是我的表结构:

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 <= ?;

我真的陷入了困境。谁能告诉我我做错了什么?

谢谢, 德尼兹

【问题讨论】:

    标签: cassandra cql cql3


    【解决方案1】:

    这是您需要为数据重构或使用分布式分析平台(如 spark)的查询。 Id 描述了您的数据如何通过数据库分布。由于此查询中未指定它,因此需要进行全表扫描以确定必要的行。 Cassandra 设计团队决定他们宁愿您根本不进行查询,也不愿进行无法扩展的查询。

    基本上每当你看到“COLUMN不能被限制”这意味着你试图执行的查询无法在你创建的表上有效地完成。

    【讨论】:

    • 感谢您的回答。虽然我使用的是单模式嵌入式 Cassandra,但我还是决定使用 Spark。我想知道它是否可以解决,您的回答对这种行为有意义。
    【解决方案2】:

    要运行查询,请使用 ALLOW FILTERING 子句,

    SELECT * FROM analytics.events WHERE name = ? AND start_time >= ? AND end_time <= ? ALLOW FILTERING;
    

    【讨论】:

    • 不幸的是,我仍然收到“不能限制主列结束时间”错误。有什么想法吗?
    • 不应鼓励使用ALLOW FILTERING
    【解决方案3】:

    进行查询的“一般”rule 是您必须至少传递所有分区键列,然后您可以按照设置的顺序添加每个键。需要在其中添加where id = x

    但是,此错误消息似乎暗示的是,一旦您选择“start_time > 34”,您就可以“沿着链条”走得最远,否则将需要“可能成本太高”ALLOW FILTERING旗帜。因此,它必须是“唯一相等”,直到单个列上的一个 &lt; &gt; 组合。一切以速度为名。这有效(虽然不提供范围查询):

     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

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2012-01-09
      • 2015-03-10
      • 2014-05-07
      • 2012-03-13
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多