如果数据在 Cassandra 中没有像 MySQL RAND() 这样的变化,有没有办法每次都获取随机行
Is there a way to get random rows each time if the data does not change in Cassandra like MySQL RAND()
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)
);
我在这些 table 中有 100 行。我想每次随机选择 10 行。
在MySQL
select * from users order by RAND() limit 10;
在卡桑德拉
select * from users limit 10;
select * from users_by_firstname limit 10;
但是从第一个 table 开始,我将获得按分区键 (userId) 生成的散列排序的静态 10 行。
从第二个开始,我将获得按 userId 排序的静态 10 行。
但如果数据不改变,它就不是随机的。
在Cassandra中有什么方法可以每次都获得随机行吗?
谢谢
慈善事业
无法直接存档。有可能模仿这个(这个解决方案并不是真正随机的,但你应该收到不同的值),但这并不是一个完美的主意。
您可以做的是,在 cassandra 令牌范围内创建一个随机值 -2^63 - 2^64。使用这个随机值,您可以执行这样的查询:
select * from users_by_firstname where token(userId) > #generated_value# limit 10;
使用此方法,您可以定义一个随机 'starting point' 从那里您可以接收 10 个用户。正如我所说,这种方法并不完美,它当然需要对如何生成随机令牌进行一些思考。极端情况可能是,您的随机值在环的一侧太远,您将收到不到 10 个值。
这是一个简短的例子:
假设您有一个用户 table,其中包含以下用户:
token(uuid) | name
----------------------+---------
-2540966642987085542 | Kate
-1621523823236117896 | Pauline
-1297921881139976049 | Stefan
-663977588974966463 | Anna
-155496620801056360 | Hans
958005880272148645 | Max
3561637668096805189 | Doro
5293579765126103566 | Paul
8061178154297884044 | Frank
8213365047359667313 | Peter
现在假设您生成值 42 作为起始标记,select 将是
select token(uuid), name from test where token(uuid) > 42 limit 10;
在此示例中,结果将是
token(id) | name
---------------------+-------
958005880272148645 | Max
3561637668096805189 | Doro
5293579765126103566 | Paul
8061178154297884044 | Frank
8213365047359667313 | Peter
如果您有大量数据和平衡的集群,此方法可能是一种合理的方法。为确保您不会 运行 进入这些边缘情况,您可以将范围限制为不靠近 cassandra 令牌范围的边缘。
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) );
我在这些 table 中有 100 行。我想每次随机选择 10 行。
在MySQL
select * from users order by RAND() limit 10;
在卡桑德拉
select * from users limit 10;
select * from users_by_firstname limit 10;
但是从第一个 table 开始,我将获得按分区键 (userId) 生成的散列排序的静态 10 行。
从第二个开始,我将获得按 userId 排序的静态 10 行。 但如果数据不改变,它就不是随机的。
在Cassandra中有什么方法可以每次都获得随机行吗?
谢谢
慈善事业
无法直接存档。有可能模仿这个(这个解决方案并不是真正随机的,但你应该收到不同的值),但这并不是一个完美的主意。
您可以做的是,在 cassandra 令牌范围内创建一个随机值 -2^63 - 2^64。使用这个随机值,您可以执行这样的查询:
select * from users_by_firstname where token(userId) > #generated_value# limit 10;
使用此方法,您可以定义一个随机 'starting point' 从那里您可以接收 10 个用户。正如我所说,这种方法并不完美,它当然需要对如何生成随机令牌进行一些思考。极端情况可能是,您的随机值在环的一侧太远,您将收到不到 10 个值。
这是一个简短的例子:
假设您有一个用户 table,其中包含以下用户:
token(uuid) | name
----------------------+---------
-2540966642987085542 | Kate
-1621523823236117896 | Pauline
-1297921881139976049 | Stefan
-663977588974966463 | Anna
-155496620801056360 | Hans
958005880272148645 | Max
3561637668096805189 | Doro
5293579765126103566 | Paul
8061178154297884044 | Frank
8213365047359667313 | Peter
现在假设您生成值 42 作为起始标记,select 将是
select token(uuid), name from test where token(uuid) > 42 limit 10;
在此示例中,结果将是
token(id) | name
---------------------+-------
958005880272148645 | Max
3561637668096805189 | Doro
5293579765126103566 | Paul
8061178154297884044 | Frank
8213365047359667313 | Peter
如果您有大量数据和平衡的集群,此方法可能是一种合理的方法。为确保您不会 运行 进入这些边缘情况,您可以将范围限制为不靠近 cassandra 令牌范围的边缘。