2015-10-28 3 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) 
); 

J'ai 100 lignes dans ces tables. Je veux obtenir 10 rangées au hasard à chaque fois.Y at-il un moyen d'obtenir des lignes au hasard chaque fois que si les données ne change pas Cassandra comme MySQL RAND()

MySQL

select * des utilisateurs par ordre RAND() limite de 10;

Dans Cassandra

select * des utilisateurs limitent 10;
select * from users_by_firstname limite 10;

Mais à partir du 1er tableau je recevrais les 10 lignes statiques triées par le hachage généré de la clé de la partition (userId). À partir de la seconde, j'obtiendrais les 10 lignes statiques triées par userId. Mais ce ne sera pas aléatoire si les données ne changent pas.

Y at-il un moyen d'obtenir des lignes aléatoires chaque fois dans Cassandra.

Merci
Chaity

Répondre

6

Il est impossible d'archiver ce directement. Il y a des possibilités d'émuler ceci (cette solution n'est pas vraiment aléatoire, mais vous devriez recevoir des valeurs différentes), mais ce n'est pas vraiment une idée parfaite.

Ce que vous pouvez faire est de créer une valeur aléatoire dans la plage de jetons Cassandra -2^63 - 2^64. Avec cette valeur aléatoire, vous pouvez effectuer une telle requête:

Sélectionnez * à partir de users_by_firstname où token (userId)> # generated_value # limit 10;

En utilisant cette méthode, vous pouvez définir un 'point de départ' aléatoire à partir duquel vous pouvez recevoir 10 utilisateurs. Comme je l'ai dit, cette méthode n'est pas parfaite et il faut certainement réfléchir à la façon de générer le jeton aléatoire. Un cas de bordure pourrait être, que votre valeur aléatoire est si loin d'un côté de l'anneau, que vous recevriez moins de 10 valeurs.

Voici un petit exemple:

Disons que vous avez une table d'utilisateurs avec les utilisateurs suivants:

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

Disons que maintenant vous générer la valeur 42 comme une start-jeton, la sélection serait être

sélectionner le jeton (uuid), nom du test où token (uuid)> 42 limite 10;

Dans cet exemple, le résultat serait

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

Cette méthode pourrait être une approche raisonnable si vous avez beaucoup de données, et un groupe équilibré. Pour vous assurer que vous ne courez pas dans ce cas limite, vous pouvez limiter la plage pour ne pas approcher les limites de la plage de jetons Cassandra.

+0

Merci pour votre réponse. C'est vraiment apprécié. – Chaity

+0

Pourriez-vous s'il vous plaît élaborer le cas de bord un peu en détail? – Chaity