2015-08-13 221 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的某個列上使用範圍進行過濾,你甚至不能在隨後的聚類列上使用=過濾器。 –