cassandra中多列的范围

时间:2015-08-13 05:40:10

标签: cassandra cql

我的表:

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中无法使用多列的范围,那么我该如何实现呢?

1 个答案:

答案 0 :(得分:5)

Cassandra在查询时非常严格,因为它不像RDBMS那样通用。您无法在Cassandra中对多个列执行范围查询。以下规则也适用:

  • 如果没有全部选择,您将需要提供分区键,以便Cassandra可以找到包含您正在寻找的数据的节点
  • 您只能过滤主键(分区键和群集列)中的列
  • 主键定义中列的顺序很重要 - 这就是Cassandra仍将数据存储在磁盘上的方式
  • 如果“前一个”列也已过滤(按主键定义的顺序),则只能对群集列进行过滤
  • 执行范围查询后,无法进一步过滤后续群集列

所有这些规则都是为了避免人们在Cassandra中运行反模式。

您必须在多个列上执行范围查询并拥有更强大的检索数据方法的一个选项是与Solr等搜索平台集成。