4

假设我有一个带有存储用户对象的列族的键空间,并且这些对象的键是用户名。

如何使用 Hector 获取按用户名排序的用户列表?

我尝试使用 RangeSlicesQuery,分页适用于此查询,但结果未以任何方式排序。

我是一个绝对的 Cassandra 初学者,谁能指出一个简单的例子来展示如何按键对列族进行排序?请询问您是否需要有关我的努力的更多详细信息。

编辑:

结果没有排序,因为我使用了默认的 RandomPartitioner 而不是 cassandra.yaml 中的 OrderPreseveringPartitioner。

可能最好不要依赖按键排序,而是使用二级索引。

4

2 回答 2

5

引用Cassandra - 权威指南

列名根据 compare_with 的值按排序顺序存储。另一方面,行以分区器定义的顺序存储(例如,使用 RandomPartitioner,它们是随机顺序等)

我猜你正在使用RandomPartitioner哪个

...以基本上随机的顺序返回数据。

您可能应该使用OrderPreservingPartitioner (OPP)where

因此,行按键顺序存储,使数据的物理结构与您的排序顺序保持一致。

请注意 OPP 的低效率。


(2014 年 3 月 7 日编辑)
重要提示:

这个答案现在很老了。

这是一个系统范围的设置。你可以设置在cassandra.yaml. 请参阅此文档。同样,OPP 非常不鼓励。本文档适用于 1.1 版本,您可以看到它已弃用。它很可能已从最新版本中删除。如果您确实想使用 OPP,您可能需要重新访问架构。

于 2011-08-02T10:10:31.560 回答
1

或者在同一列族中创建一个名为“meta:userNames”的行,并将所有用户名作为查找哈希。类似的东西。

Users {
    key: "meta:userNames" {david:david, paolo:paolo, victor:victor},
    key: "paolo" {password:"*****", locale:"it_it"},
    key: "david" {password:"*****", locale:"en_us"},
    key: "victor" {password:"*****", locale:"en_uk"}
}

首先查询meta:userNames列(已排序)并使用它们来获取用户行。不要像在 SQL 驱动的数据库中那样尝试通过单个数据库查询来获取所有内容。使用 Cassandra 作为巨大的 Hash Map,它提供对其数据的快速随机访问。

于 2011-10-25T19:13:35.713 回答