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标记范围的边缘.
| 归档时间: |
|
| 查看次数: |
2332 次 |
| 最近记录: |