2012-09-05 23 views
4

使用隨機分區時,有什麼方法可以用複合行鍵範圍查詢行嗎?Cassandra Hector客戶端:使用隨機分區時可以在組合行鍵上使用RangeSlicesQuery?

林workling與列科通過CQL V3創造這樣的:

CREATE TABLE products (rowkey CompositeType(UTF8Type,UTF8Type,UTF8Type,UTF8Type) 
PRIMARY KEY, prod_id varchar, class_id varchar, date varchar); 

該表中的數據是這樣的:

RowKey: 6:3:2:19 
=> (column=class_id, value=254, timestamp=1346800102625002) 
=> (column=date, value=2034, timestamp=1346800102625000) 
=> (column=prod_id, value=1922, timestamp=1346800102625001) 
------------------- 
RowKey: 0:14:1:16 
=> (column=class_id, value=144, timestamp=1346797896819002) 
=> (column=date, value=234, timestamp=1346797896819000) 
=> (column=prod_id, value=4322, timestamp=1346797896819001) 
------------------- 

我試圖找到一種方法,範圍查詢在這些複合行鍵上類似於我們如何在複合列上切片查詢。根據我選擇的啓動和停止鍵,以下方法有時會成功返回有用的內容。

Composite startKey = new Composite(); 
startKey.addComponent(0, "3", Composite.ComponentEquality.EQUAL); 
startKey.addComponent(1, "3", Composite.ComponentEquality.EQUAL); 
startKey.addComponent(2, "3", Composite.ComponentEquality.EQUAL); 
startKey.addComponent(3, "3", Composite.ComponentEquality.EQUAL); 
Composite stopKey = new Composite(); 
stopKey.addComponent(0, "6", Composite.ComponentEquality.EQUAL); 
stopKey.addComponent(1, "6", Composite.ComponentEquality.EQUAL); 
stopKey.addComponent(2, "6", Composite.ComponentEquality.EQUAL); 
stopKey.addComponent(3, "6" , Composite.ComponentEquality.GREATER_THAN_EQUAL); 

RangeSlicesQuery<Composite, String, String> rangeSlicesQuery = 
HFactory.createRangeSlicesQuery(keyspace, CompositeSerializer.get(), StringSerializer.get(), StringSerializer.get()); 
rangeSlicesQuery.setColumnFamily(columnFamilyName); 
rangeSlicesQuery.setKeys(startKey,stopKey); 
rangeSlicesQuery.setRange("", "", false, 3); 

大部分時間數據庫返回此:

InvalidRequestException(why:start key's md5 sorts after end key's md5. 
this is not allowed; you probably should not specify end key at all, 
under RandomPartitioner) 

是否有人有一個想法,如果這樣的事情可以不使用保序分區可以實現嗎?我是否必須爲此用例構建自定義行鍵索引?

非常感謝!


其他信息:

我試圖做的是存儲在使用這兩種複合排按鍵編碼日期/時間/地點和複合列來存儲信息的表的銷售交易數據對已售出的商品:

設定每筆交易項目的規模各不相同,包括關於每一個項目的大小,顏色和數量的信息:

{ ... items : 
[ { item_id : 43523 , size : 050 , color : 123 , qty : 1 } , 
    { item_id : 64233 , size : 048 , color : 834 , qty : 1 } , 
    { item_id : 23984 , size : 000 , color : 341 , qty : 3 } , 
… ] } 

還有關於何時何地交易發生的包括獨特的交易ID信息:

{ trx_id : 23324827346, store_id : 8934 , date : 20110303 , time : 0947 , … 

我最初的做法是把每一個項目在一個單獨的行,讓應用程序組項目一起回來的事務ID。這工作正常。但現在我想利用組合柱的結構功能的表示(每件)內持續嵌套項數據是這樣的:

item_id:’size’ = <value> ; item_id:’color’ = <value> ; item_id:’qty’ = <value> ; … 
43523:size = 050 ; 43523:color = 123 ; 43523:qty = 1 ; … 

數據的其餘部分將在複合行鍵編碼像這樣:

date : time : store_id : trx_id 
20110303 : 0947 : 001 : 23324827346 

我需要能夠運行像查詢:這是日期20110301和商店倍1200,1400之間20110310之間出售的所有項目25 - 50我與組合柱實現迄今每個商店使用一個寬行,並將所有其餘數據放入每個商品3個不同的複合列中:

date:time:<type>:prod_id:transaction_id = <value> ; … 
20110303:0947:size:43523:23324827346 = 050 ; 
20110303:0947:color:43523:23324827346 = 123 ; 
20110303:0947:qty:43523:23324827346 = 1 ; 

它正在工作,但它看起來並不高效。 有沒有其他的選擇?

回答

2

您正在爲每個分區創建一行,所以應該清楚RandomPartitioner不會給你有序的範圍查詢。

您可以在範圍內執行有序範圍這是非常常見的分區,例如, http://rubyscale.com/blog/2011/03/06/basic-time-series-with-cassandra/http://www.datastax.com/dev/blog/advanced-time-series-with-cassandra

+0

感謝您的鏈接!這就是我迄今爲止所嘗試的。請看看我對我最初的問題所做的補充。 結果的順序不是問題,它更多關於InvalidRequestException ... 我不得不承認我真的沒有散列函數的專家。所以我只需要接受一個複合行鍵['3:3:3:3']的散列值大於['6:6:6:6']? 比我想我的計劃沒有未來... – maxbrenn

相關問題