2016-10-03 145 views
1

你好,我正在讀的令牌功能卡桑德拉文檔,瞭解令牌功能,卡桑德拉

Screenshot of documentation, https://docs.datastax.com/en/cql/3.1/cql/cql_using/paging_c.html

我試圖實現一個卡桑德拉表分頁,我無法理解的線條突出。該文件講述了k> 42與toKEN(k)> toKEN(42)之間的區別,但我無法理解「基於令牌的比較」

期待詳細解釋何時令牌功能WHERE子句的一部分。

回答

8

爲了解其中分區它應該放置您的數據,C *對每行的PARTITION KEY進行一些計算。具體而言,在每個節點上,行按照分區程序生成的標記進行排序(每個分區具有按集羣鍵排序的數據)。不同的partitioners執行不同類型的計算。

雖然Murmur3Partitioner計算partion關鍵的MurmurHashByteOrderedPartitioner使用分區密鑰本身的原始數據字節:當您使用Murmur3Partitioner,你的行是按照其哈希排序,而當你使用ByteOrderedPartitioner,您的行按原始值直接排序

舉個例子,假設你有一個表是這樣的:

CREATE TABLE test (
    username text, 
    ... 
    PRIMARY KEY (username) 
); 

而且假設你試圖找到對應的用戶名和abcdabceabcf行的存儲位置。這些字符串的十六進制表示分別爲0x616263640x616263650x61626366。假設我們在這兩個字符串上應用了這個MH3實現(x86,32位爲了簡單起見,沒有可選的種子),我們分別得到‭0x‭43ED676A‬‬0x‭‭E297E8AA‬‬0x‭‭87E62668‬‬。因此,在MH3的情況下,字符串的標記將是這3個值,而在BOP的情況下,標記本身將是原始數據值:0x61626364,0x616263650x61626366

現在您可以看到,使用不同分區程序時,按標記排序的存儲數據會產生不同的結果。一個SELECT * FROM test;查詢將以不同的順序返回行。如果您的數據已按其原始值排序,您需要以相同的順序檢索該數據,因此當您使用MH3時,順序與您的數據無關,這可能是(但不應該是)。

回到問題,TOKEN功能允許您直接數據的令牌過濾代替數據的。 documentation說:

使用TOKEN函數進行排序並不總是提供預期的 結果。使用TOKEN函數在 分區鍵列上表達條件關係。在這種情況下,查詢將根據分區鍵的標記而不是該值返回基於 的行。

舉個例子,你可以發出:

SELECT * FROM test WHERE TOKEN(username) <= TOKEN('abcf'); 

,你會得到圖什麼? abcdacbf排!!!這是因爲訂單有時候很重要......就像您正在嘗試執行分頁的情況一樣,您可以通過任何可用的C *驅動程序(例如Java driver)爲您處理哪個

也就是說,對於新簇的建議分區程序是Murmur3Partitioner,您可以檢查documentation以瞭解每個分區程序的優缺點。請注意,分區程序是羣集範圍內的設置,一旦設置,您無法在不將所有數據都推送到另一個羣集的情況下進行更改。

請謹慎選擇。

+0

絕對是我正在尋找的答案 –

+0

節點和分區的排序順序有什麼不同。我相信一個表的每個分區都有一個專用節點 –

2

卡桑德拉數據根據行PartitionKeyToken分區。 token使用散列函數進行gerenated。函數Token生成通過將散列函數應用於其參數而創建的值。

這就是說,幾乎所有的驅動程序現在默認自動頁面。