假设我有一个带有存储用户对象的列族的键空间,这些对象的键是用户名。
如何使用Hector获取按用户名排序的用户列表?
我尝试使用RangeSlicesQuery,此查询可以正常分页,但结果不会以任何方式排序。
我是一个绝对的Cassandra初学者,有人能指出一个简单的例子,展示如何按键对列族进行排序吗?请询问您是否需要有关我的努力的更多详细信息。
编辑:
结果没有排序,因为我在cassandra.yaml中使用了默认的RandomPartitioner而不是OrderPreseveringPartitioner。
最好不要依赖按键排序,而是使用二级索引。
答案 0 :(得分:5)
引用Cassandra - The Definitive Guide
列名称根据compare_with的值按排序顺序存储。行, 另一方面,按照分区器定义的顺序存储(例如, 使用RandomPartitioner,它们是随机顺序等。)
我猜您使用的是RandomPartitioner
...以基本随机的顺序返回数据。
您应该使用OrderPreservingPartitioner (OPP)
其中
因此存储行 按键顺序,将数据的物理结构与排序顺序对齐。
注意OPP效率低下。
(2014年3月7日编辑)
重要:强>
这个答案现在很老了。
这是一个系统范围的设置。您可以在cassandra.yaml
中进行设置。见this doc。同样,OPP非常气馁。本文档适用于1.1版,您可以看到已弃用。它可能会从最新版本中删除。如果您确实想要使用OPP,您可能需要重新审视架构的架构。
答案 1 :(得分: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,可以快速随机访问其数据。