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

标签 sorting indexing cassandra columnsorting

我将数据存储在一个 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/

相关文章:

database - PostgreSQL中支持关系操作的Cassandra的TimeUUID的替代

cassandra - 升级Cassandra而不丢失当前数据

php - 如何创建从 mysql 数据库中选择的新数组

Python - 对列表列表中的元素进行排序

python - 如何在 python 中填充 pandas 数据框列中的剩余数值并作为索引?

python - "tuple index out of range"

elasticsearch - 何时直接查询cassandra与使用索引器

python - 对列表中的字典元素进行排序

javascript - 如何按月份然后按客户对一系列产品销售进行分组

mysql - 可以使用复合索引对 MySQL 中的更新查询进行排序吗?