2011-08-02 61 views
4

讓我們假設我有一個存儲用戶對象的列族的密鑰空間,這些對象的關鍵是用戶名。按鍵排序Cassandra

如何使用Hector獲取按用戶名排序的用戶列表?

我試着用RangeSlicesQuery,這個查詢的分頁工作正常,但結果沒有以任何方式排序。

我是一個絕對的卡桑德拉初學者,任何人都可以指向一個簡單的例子,顯示如何按鍵排序列家族?請問你是否需要更多關於我的努力的細節。

編輯:

結果是沒有排序,因爲我使用的是默認RandomPartitioner,而不是在cassandra.yaml的OrderPreseveringPartitioner。

也許最好不要依賴按鍵排序,而要使用二級索引。

回答

5

Cassandra - The Definitive Guide引用

列名稱根據compare_with的值的排序順序存儲。行, 在另一方面,存儲在

我想你正在使用哪個RandomPartitioner

由分割器定義的順序(例如,與 RandomPartitioner,它們以隨機順序等)

...以基本上隨機的順序返回數據。

你應該使用OrderPreservingPartitioner (OPP)其中

行也因此被鍵順序存儲 ,用你的排序順序排列的數據的物理結構。

請注意OPP的低效率。


(於2014年3月7日編輯)
重要:

這個答案現在已經很老了。

這是一個系統範圍的設置。您可以在cassandra.yaml中設置。見this doc。再次,OPP非常沮喪。本文檔適用於版本1.1,您可以看到已棄用。它很可能是從最新版本中刪除的。如果您確實想要使用OPP,您可能需要重新審視體系結構。

+0

使用OOP(OrderPreservingPartitioner),然後鍵是爲了通過一些PK,如果我是插入一個新的數據到卡桑德拉表,是否意味着它會插入新的元素在正確的位置還是會訴諸的東西是什麼時候? – Pinocchio

+0

你如何使用它OrderUserPartitioner? – Pinocchio

+0

它是否像鍵盤空間或表格的設置? – Pinocchio

1

或者在同一列族中創建一個名爲「meta:userNames」的行,並將所有用戶名作爲查找哈希值。類似的東西。

Users { 
    key: "meta:userNames" {david:david, paolo:paolo, victor:victor}, 
    key: "paolo" {password:"*****", locale:"it_it"}, 
    key: "david" {password:"*****", locale:"en_us"}, 
    key: "victor" {password:"*****", locale:"en_uk"} 
} 

首先查詢meta:userNames列(被整理),並利用它們來獲取用戶的行。不要試圖像在SQL驅動的數據庫中那樣通過單個數據庫查詢獲取所有內容。使用Cassandra作爲提供對其數據的快速隨機訪問的巨大哈希映射。