创建表用户( 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
无法直接将其存档。可以模拟此方法(此解决方案并非真正随机,但您应该获得不同的值),但这并不是一个完美的主意。
您可以做的是,在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] 删除。
我来说两句