如果数据在Cassandra中没有变化,如MySQL RAND(),是否有办法获取随机行?

Cha*_*ity 2 cassandra cql3 cqlsh cassandra-2.0

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()限制10从用户订单中选择*;

在卡桑德拉

select*from users limit 10;
select*from users_by_firstname limit 10;

但是从第一个表中我将得到静态的10行,它们按生成的分区键(userId)的哈希值排序.

从第二个我将获得由userId排序的静态10行.但如果数据没有改变,它将不是随机的.

有没有办法在Cassandra中每次获取随机行.

谢谢
Chaity

Has*_*kus 10

无法直接归档此内容.有可能模仿这个(这个解决方案不是随机的,但你应该得到不同的值),但它并不是一个完美的主意.

你可以做的是,在cassandra令牌范围-2 ^ 63 - 2 ^ 64中创建一个随机值.使用此随机值,您可以执行以下查询:

select*from users_by_firstname其中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
Run Code Online (Sandbox Code Playgroud)

现在假设您生成值42作为开始标记,选择将是

select token(uuid),来自test的名称,其中token(uuid)> 42 limit 10;

在这个例子中,结果将是

 token(id)           | name
---------------------+-------
  958005880272148645 |   Max
 3561637668096805189 |  Doro
 5293579765126103566 |  Paul
 8061178154297884044 | Frank
 8213365047359667313 | Peter
Run Code Online (Sandbox Code Playgroud)

如果您拥有大量数据和平衡群集,则此方法可能是一种合理的方法.为了确保不会遇到这些边缘情况,可以将范围限制为不接近cassandra标记范围的边缘.