2015-10-28 51 views
2
 
CREATE TABLE users (
userId uuid, 
firstname varchar, 
mobileNo varchar, 
PRIMARY KEY (userId) 
); 
 
CREATE TABLE users_by_firstname (
userId uuid, 
firstname varchar, 
mobileNo varchar, 
PRIMARY KEY (firstname,userId) 
); 

每一次我都在這些表中100行獲取隨機行。我想每次隨機選取10行。有沒有一種辦法,如果數據不卡桑德拉像MySQL RAND改變()

在MySQL

SELECT * FROM用戶爲了通過RAND()限制10;

在卡桑德拉

SELECT * FROM限制用戶10;
select * from users_by_firstname limit 10;

但是,從表1,我會得到通過分區鍵(用戶ID)的生成散列排序的靜態10行。

從第二個我會得到靜態10行排序userId。 但是,如果數據沒有改變,它不會是隨機的。

是否有任何方法可以在Cassandra中每次獲得隨機行。

感謝
Chaity

回答

6

這是不可能直接歸檔此。有可能模仿這個(這個解決方案並不是真正的隨機,但你應該得到不同的值),但它不是一個完美的想法。

您可以做的是,在cassandra令牌範圍-2^63 - 2^64中創建一個隨機值。有了這個隨機值,你可以執行這樣的查詢:

select * from users_by_firstname where token(userId)>#generated_value#limit 10;

使用此方法,您可以從可以接收10個用戶的位置定義一個隨機「起點」。正如我所說的,這種方法並不完美,它肯定需要關於如何生成隨機令牌的一些想法。一個邊緣情況可能是,你的隨機值到目前爲止在環的一側,你會收到少於10個值。

下面是一個簡單的例子:

比方說你有以下用戶一個用戶表:

token(uuid)   | name 
----------------------+--------- 
-2540966642987085542 | Kate 
-1621523823236117896 | Pauline 
-1297921881139976049 | Stefan 
    -663977588974966463 | Anna 
    -155496620801056360 | Hans 
    958005880272148645 |  Max 
    3561637668096805189 | Doro 
    5293579765126103566 | Paul 
    8061178154297884044 | Frank 
    8213365047359667313 | Peter 

現在,讓我們說你產生作爲啓動標誌值42,選擇會是

select token(uuid),name from test where(uuid)> 42 limit 10;

在這個例子中,結果將是

token(id)   | name 
---------------------+------- 
    958005880272148645 | Max 
3561637668096805189 | Doro 
5293579765126103566 | Paul 
8061178154297884044 | Frank 
8213365047359667313 | Peter 

,如果你有大量的數據,這種方法可能是一個合理的方法,以及均衡的集羣。爲了確保不會遇到這些邊緣情況,可以將範圍限制在cassandra令牌範圍的邊緣附近。

+0

感謝您的回覆。它真的很感激。 – Chaity

+0

請詳細說明一下邊緣情況嗎? – Chaity