2011-08-02 62 views
4

让我们假设我有一个存储用户对象的列族的密钥空间,这些对象的关键是用户名。按键排序Cassandra

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

我试着用RangeSlicesQuery,这个查询的分页工作正常,但结果没有以任何方式排序。

我是一个绝对的卡桑德拉初学者,任何人都可以指向一个简单的例子,显示如何按键排序列家族?请问你是否需要更多关于我的努力的细节。

编辑:

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

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

回答

5

Cassandra - The Definitive Guide引用

列名称根据compare_with的值的排序顺序存储。行, 在另一方面,存储在

我想你正在使用哪个RandomPartitioner

由分割器定义的顺序(例如,与 RandomPartitioner,它们以随机顺序等)

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

你应该使用OrderPreservingPartitioner (OPP)其中

行也因此被键顺序存储 ,用你的排序顺序排列的数据的物理结构。

请注意OPP的低效率。


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

这个答案现在已经很老了。

这是一个系统范围的设置。您可以在cassandra.yaml中设置。见this doc。再次,OPP非常沮丧。本文档适用于版本1.1,您可以看到已弃用。它很可能是从最新版本中删除的。如果您确实想要使用OPP,您可能需要重新审视体系结构。

+0

使用OOP(OrderPreservingPartitioner),然后键是为了通过一些PK,如果我是插入一个新的数据到卡桑德拉表,是否意味着它会插入新的元素在正确的位置还是会诉诸的东西是什么时候? – Pinocchio

+0

你如何使用它OrderUserPartitioner? – Pinocchio

+0

它是否像键盘空间或表格的设置? – Pinocchio

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作为提供对其数据的快速随机访问的巨大哈希映射。