Cassandra时间范围查询

Cassandra time range query

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

这是我的 table 结构:

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

我真的卡在这上面了。谁能告诉我我做错了什么?

谢谢, 德尼兹

对于运行查询,使用ALLOW FILTERING子句,

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

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

基本上,每当您看到 "COLUMN cannot be restricted" 时,这意味着您尝试执行的查询无法在您创建的 table 上有效地完成。

"general" rule 进行查询是你必须至少传递所有分区键列,然后你可以按照它们设置的顺序添加每个键。”所以为了要完成这项工作,您需要在其中添加 where id = x

但是,这条错误消息似乎暗示的是,一旦您 select 'start_time > 34' 到 "down the chain" 就可以了,否则就需要 "potentially too costly" ALLOW FILTERING 标志。所以它必须是 "only equality" 到一个 < > 组合在一个列上。一切以速度之名。这有效(虽然没有给出范围查询):

 SELECT * FROM events WHERE name = 'a' AND start_time = 33 and end_time <= 34 and id = '35';

如果您要查找事件 "happening at minute y" 也许可以使用不同的数据模型,例如为事件正在进行或未进行的每一分钟添加一个事件,或者基于“hour" or what not. See also