如果数据没有像MySQL RAND()一样在Cassandra中发生变化,是否有一种方法可以每次获取随机行

贞操
创建表用户(
 userId uuid,
 varchar名字,
 mobileNo varchar,
 主键(userId)
);
创建表users_by_firstname(
 userId uuid,
 varchar名字,
 mobileNo varchar,
 主键(名字,用户名)
);

这些表中有100行。我想每次随机选择10行。

在MySQL中

从RAND()限制10的用户订单中选择*;

在卡桑德拉

从用户限制10中选择*;
选择* from users_by_firstname limit 10;

但是从第一个表中,我会得到静态的10行,该行按分区键(userId)的生成的哈希排序。

从第二个开始,我将获得按userId排序的静态10行。但是,如果数据不变,它将不会是随机的。

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

感谢
Chaity

HashtagMarkus

无法直接将其存档。可以模拟此方法(此解决方案并非真正随机,但您应该获得不同的值),但这并不是一个完美的主意。

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

从users_by_firstname选择*,其中token(userId)>#generation_value#限制为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生成为起始令牌,则选择为

选择令牌(uuid),从测试中选择令牌(uuid)> 42限制10的名称;

在此示例中,结果将是

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档