2015-08-13 223 views
2
多列

我的表:范围在卡桑德拉

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中不可能有多个列的范围,那我该如何实现呢?

回答

5

对于查询,Cassandra的限制性很大,因为它不像RDBMS那样具有通用性。您无法在Cassandra的多个列上执行范围查询。以下规则也适用:

  • 如果不是做全选,你将需要提供分区键,以便卡桑德拉可以找到你要找的
  • 您只能在列筛选数据的节点它们位于主键(分区键和集群列)中
  • 主键定义中列的顺序很重要 - 这就是Cassandra仍然将数据存储在磁盘上的方式
  • 您只能过滤一个集群如果'previous'列也被过滤(按照主键定义的顺序)
  • 一旦执行范围查询,你不能再在随后的聚类列

所有这些规则是有避免内卡桑德拉运行反模式的人进行筛选。

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

+0

我可以在范围查询之后放置一个'IN'查询吗? –

+0

不,一旦你在Cassandra的某个列上使用范围进行过滤,你甚至不能在随后的聚类列上使用=过滤器。 –