gpt4 book ai didi

sorting - 如何从 Cassandra 表构建排序的排名列表?

转载 作者:行者123 更新时间:2023-12-04 18:22:13 25 4
gpt4 key购买 nike

我将数据存储在一个 Cassandra 2.0.10 表中。有一列(名为score),整数类型,可以取任意值。我需要编写一个后台作业,为另一列 rank 赋值,为得分字段中具有最高值的行赋值 1,为次高的行赋予值 2,依此类推.具有最小 score 值的行必须获得分配给 rank 的总行数。目前在CQL中定义为

CREATE TABLE players
(user int, rank int, score int, details blob, PRIMARY KEY(user))

打赌它像 PostgreSQL,我会做类似的事情

select id, rank from players order by score desc offset A limit 100;

对 A 使用递增的值,并以这种方式在大小为 100 的页面中迭代数据库。它会在一个查询中给出前 100 名玩家,在第二个查询中给出前 100 到 200 名玩家,等等。然后我可以通过 id 触发更新语句,一个接一个或分批处理。

当我尝试在 Cassandra CQL 中做同样的事情时,结果发现许多需要的功能不受支持(没有顺序,没有偏移量,没有明确的方式如何访问所有行)。我尝试为分数列构建索引,但这没有帮助。

此等级分配是一项辅助工作。迭代几天甚至几周都没有问题。稍微不一致是可以的,因为在作业运行时分数可能会发生变化。它不是应用程序的主要功能。主要功能不使用范围查询,Cassandra 在那里工作得很好。

是否有可能以某种方式结合 Java 和 CQL 来实现这种排名分配,或者限制足够严重,我需要使用不同的数据库引擎?

最佳答案

根据我的经验,Cassandra 不适合此类任务。你绝对可以让它工作,但解决方案不会简单有效。遍历一个表中的所有行以更新排名没有问题,但是按照您的排名顺序遍历所有行就会出现问题。您可能会保留两个表:

players(id, rank) 和 rank_to_id(rank, id_list)。然后您应该使用以下方法查询第二页:

select * from rank_to_id where rank > 100 limit 100

排名分配者的责任是在排名发生变化时正确更新两个表。基本上,您将实现一个 PostgreSQL 开箱即用的简单数据库索引。

我还建议您转而查看 Redis 数据库。它具有像 Sorted Set 这样出色的数据类型,它几乎完全满足您的需求:http://redis.io/commands#sorted_set .但是,这取决于您拥有的数据量。 Redis 是内存数据库。

PostgreSQL 也可能是一个很好的解决方案。你为什么不想使用它?

关于sorting - 如何从 Cassandra 表构建排序的排名列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com