你好,我正在讀的令牌功能卡桑德拉文檔,瞭解令牌功能,卡桑德拉
我試圖實現一個卡桑德拉表分頁,我無法理解的線條突出。該文件講述了k> 42與toKEN(k)> toKEN(42)之間的區別,但我無法理解「基於令牌的比較」
期待詳細解釋何時令牌功能WHERE子句的一部分。
你好,我正在讀的令牌功能卡桑德拉文檔,瞭解令牌功能,卡桑德拉
我試圖實現一個卡桑德拉表分頁,我無法理解的線條突出。該文件講述了k> 42與toKEN(k)> toKEN(42)之間的區別,但我無法理解「基於令牌的比較」
期待詳細解釋何時令牌功能WHERE子句的一部分。
爲了解其中分區它應該放置您的數據,C *對每行的PARTITION KEY
進行一些計算。具體而言,在每個節點上,行按照分區程序生成的標記進行排序(每個分區具有按集羣鍵排序的數據)。不同的partitioners執行不同類型的計算。
雖然Murmur3Partitioner計算partion關鍵的MurmurHash的ByteOrderedPartitioner使用分區密鑰本身的原始數據字節:當您使用Murmur3Partitioner,你的行是按照其哈希排序,而當你使用ByteOrderedPartitioner,您的行按原始值直接排序。
舉個例子,假設你有一個表是這樣的:
CREATE TABLE test (
username text,
...
PRIMARY KEY (username)
);
而且假設你試圖找到對應的用戶名和abcd
和abce
的abcf
行的存儲位置。這些字符串的十六進制表示分別爲0x61626364
和0x61626365
和0x61626366
。假設我們在這兩個字符串上應用了這個MH3實現(x86,32位爲了簡單起見,沒有可選的種子),我們分別得到0x43ED676A
和0xE297E8AA
和0x87E62668
。因此,在MH3的情況下,字符串的標記將是這3個值,而在BOP的情況下,標記本身將是原始數據值:0x61626364
,0x61626365
和0x61626366
。
現在您可以看到,使用不同分區程序時,按標記排序的存儲數據會產生不同的結果。一個SELECT * FROM test;
查詢將以不同的順序返回行。如果您的數據已按其原始值和排序,您需要以相同的順序檢索該數據,因此當您使用MH3時,順序與您的數據無關,這可能是(但不應該是)。
回到問題,TOKEN
功能允許您直接數據的令牌過濾代替數據的。 documentation說:
使用TOKEN函數進行排序並不總是提供預期的 結果。使用TOKEN函數在 分區鍵列上表達條件關係。在這種情況下,查詢將根據分區鍵的標記而不是該值返回基於 的行。
舉個例子,你可以發出:
SELECT * FROM test WHERE TOKEN(username) <= TOKEN('abcf');
,你會得到圖什麼? abcd
和acbf
排!!!這是因爲訂單有時候很重要......就像您正在嘗試執行分頁的情況一樣,您可以通過任何可用的C *驅動程序(例如Java driver)爲您處理哪個。
也就是說,對於新簇的建議分區程序是Murmur3Partitioner,您可以檢查documentation以瞭解每個分區程序的優缺點。請注意,分區程序是羣集範圍內的設置,一旦設置,您無法在不將所有數據都推送到另一個羣集的情況下進行更改。
請謹慎選擇。
卡桑德拉數據根據行PartitionKey
的Token
分區。 token
使用散列函數進行gerenated。函數Token
生成通過將散列函數應用於其參數而創建的值。
這就是說,幾乎所有的驅動程序現在默認自動頁面。
絕對是我正在尋找的答案 –
節點和分區的排序順序有什麼不同。我相信一個表的每個分區都有一個專用節點 –