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
在你投反对票之前,我想声明我查看了所有类似的问题,但我仍然遇到可怕的 "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