cassandra中多列的范围
range on multiple columns in cassandra
我的table:
CREATE TABLE user_position (
geopart text, // first 3 characters of geohash
geohash text,
datetime timestamp,
userId bigint,
PRIMARY KEY ((geopart), geohash, datetime, user_id)
);
我的虚拟查询:
select * from user_position where geopart = 'abc' and geohash > 'a' and geohash < 'z' and datetime >= '2015-08-08 15:08:58+0530';
错误:
Bad Request: PRIMARY KEY column "datetime" cannot be restricted (preceding column "geohash" is restricted by a non-EQ relation)
问题:
我做错了什么?如果在 Cassandra 中无法实现多列范围,那么我该如何实现?
Cassandra 在查询方面非常严格,因为它不像 RDBMS 那样通用。您不能在 Cassandra 中对多列执行范围查询。以下规则也适用:
- 如果不执行 select all,您将需要提供分区键,以便 Cassandra 可以找到包含您要查找的数据的节点
- 您只能过滤主键中的列(分区键和集群列)
- 主键定义中列的顺序很重要——这就是 Cassandra 仍然在磁盘上存储数据的方式
- 如果 'previous' 列也被过滤(按照主键定义的顺序),您只能对聚簇列进行过滤
- 执行范围查询后,您无法进一步过滤后续的聚类列
所有这些规则都是为了避免人们在 Cassandra 中使用 运行 反模式。
您必须对多列执行范围查询并拥有更强大的数据检索方法的一个选项是与搜索平台(如 Solr)集成。
我的table:
CREATE TABLE user_position (
geopart text, // first 3 characters of geohash
geohash text,
datetime timestamp,
userId bigint,
PRIMARY KEY ((geopart), geohash, datetime, user_id)
);
我的虚拟查询:
select * from user_position where geopart = 'abc' and geohash > 'a' and geohash < 'z' and datetime >= '2015-08-08 15:08:58+0530';
错误:
Bad Request: PRIMARY KEY column "datetime" cannot be restricted (preceding column "geohash" is restricted by a non-EQ relation)
问题:
我做错了什么?如果在 Cassandra 中无法实现多列范围,那么我该如何实现?
Cassandra 在查询方面非常严格,因为它不像 RDBMS 那样通用。您不能在 Cassandra 中对多列执行范围查询。以下规则也适用:
- 如果不执行 select all,您将需要提供分区键,以便 Cassandra 可以找到包含您要查找的数据的节点
- 您只能过滤主键中的列(分区键和集群列)
- 主键定义中列的顺序很重要——这就是 Cassandra 仍然在磁盘上存储数据的方式
- 如果 'previous' 列也被过滤(按照主键定义的顺序),您只能对聚簇列进行过滤
- 执行范围查询后,您无法进一步过滤后续的聚类列
所有这些规则都是为了避免人们在 Cassandra 中使用 运行 反模式。
您必须对多列执行范围查询并拥有更强大的数据检索方法的一个选项是与搜索平台(如 Solr)集成。