按卡索德拉的钥匙排序

时间:2011-08-02 09:22:06

标签: sorting cassandra hector

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

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

我尝试使用RangeSlicesQuery,此查询可以正常分页,但结果不会以任何方式排序。

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

编辑:

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

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

2 个答案:

答案 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,可以快速随机访问其数据。