2014-08-31 44 views
3

我將數據存儲在一個Cassandra 2.0.10表中。有一列(名爲score),整數類型,可以採取任何值。我需要編寫一個後臺作業,將值分配給另一列rank,給出值爲1的分數字段中值最高的行,值爲2的分數字段,等等。具有最小值score的行必須獲得分配給rank的總行數。這是目前在定製列表定義爲如何從卡桑德拉表建立排序列表?

CREATE TABLE players 
    (user int, rank int, score int, details blob, PRIMARY KEY(user)) 

賭注它像PostgreSQL的,我會做一些喜歡使用增加了一個值

select id, rank from players order by score desc offset A limit 100; 

和這樣迭代數據庫的大小100.頁在一次查詢中會給我排名前100的玩家,第二次排名前100到200等等。然後我可以通過ID,逐個或批量發佈更新聲明。

當我嘗試在Cassandra CQL中做同樣的事情時,發現許多所需功能不受支持(沒有順序,沒有偏移,沒有明確的方式來訪問所有行)。我試圖建立分數列的索引,但這沒有幫助。

這個等級分配是一個幫手工作。迭代需要幾天甚至幾周是沒有問題的。可以稍微不一致,因爲在作業運行時分數可能會發生變化。這不是應用程序的主要功能。主要功能不使用範圍查詢,Cassandra可以在那裏很好地工作。

是否有可能以某種方式將Java和CQL結合起來使用,或者限制足夠嚴重我需要使用不同的數據庫引擎?

+0

請編輯您的帖子,添加表格說明。 – 2014-09-01 07:07:58

+0

在CQL中添加了表格聲明。 – h22 2014-09-01 17:55:03

回答

1

根據我的經驗,卡桑德拉不適合這種類型的任務。你當然可以做到這一點,但解決方案不會簡單而有效。遍歷一個表中的所有行來更新行列沒有問題,但是按照行列順序迭代所有行是有問題的。你可以保留兩張牌:

players(id,rank)and rank_to_id(rank,id_list)。然後,你應該使用查詢第二頁:

SELECT * FROM rank_to_id其中排名> 100極限100

你的排名出讓方的責任將是正確更新兩個表時排名正在發生變化。基本上由此你將實現PostgreSQL開箱即用的簡單數據庫索引。

另外我建議你看看Redis DB。它具有Sorted Set這樣一個很好的數據類型,它幾乎可以實現你所需要的:http://redis.io/commands#sorted_set。但是,這取決於您擁有的數據量。 Redis是內存數據庫。

PostgreSQL也可能是一個很好的解決方案。你爲什麼不想用它?