在Cassandra中按键排序

4
假设我有一个keyspace,其中包含一个列族,该列族存储用户对象,这些对象的键是用户名。
如何使用Hector按用户名排序获取用户列表?
我尝试使用RangeSlicesQuery进行分页查询,但是结果并没有以任何方式排序。
我是绝对的Cassandra初学者,有没有人可以给我指一条简单的例子,展示如何按键排序列族?如果需要更多详细信息,请告诉我。
编辑:
结果未排序是因为我在cassandra.yaml中使用了默认的RandomPartitioner,而非OrderPreseveringPartitioner。
可能最好不要依赖按键排序,而是使用二级索引。
2个回答

5

引用Cassandra - The Definitive Guide

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

我猜你正在使用RandomPartitioner,它会以基本上随机的顺序返回数据。

因此,行按键顺序存储,将数据的物理结构与排序顺序对齐。

你应该使用OrderPreservingPartitioner (OPP),但要注意其效率低下。


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

这个答案现在非常陈旧。

这是一个系统范围的设置。您可以在 cassandra.yaml 中进行设置。请参见 this doc。再次强调,强烈不建议使用 OPP。此文档适用于版本 1.1,并且你可以看到它已被弃用。最新版可能已将其删除。如果您确实想使用 OPP,则可能需要重新审查架构。


当使用OOP(OrderPreservingPartitioner)时,键按某个PK排序,如果我要将新数据插入Cassandra表中,这是否意味着它会将新元素插入正确的位置,还是会重新排序? - Charlie Parker
如何在表OrderPreservingPartitioner中使用它? - Charlie Parker
这是一个针对键空间或表格的设置吗? - Charlie Parker

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用作巨大的哈希映射,它可以快速随机访问其数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接