如果数据在 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 令牌范围的边缘。