4

ユーザーオブジェクトを格納する列ファミリーを持つキースペースがあり、これらのオブジェクトのキーがユーザー名であると仮定します。

Hectorを使用して、ユーザー名でソートされたユーザーのリストを取得するにはどうすればよいですか?

RangeSlicesQueryを使用しようとしましたが、ページングは​​このクエリで正常に機能しますが、結果はまったく並べ替えられません。

私はカサンドラの初心者ですが、列ファミリーをキーで並べ替える方法を示す簡単な例を教えてもらえますか?私の取り組みについてさらに詳しく知りたい場合は、お問い合わせください。

編集:

cassandra.yamlのOrderPreseveringPartitionerの代わりにデフォルトのRandomPartitionerを使用したため、結果は並べ替えられませんでした。

おそらく、キーによる並べ替えに依存するのではなく、セカンダリインデックスを使用する方がよいでしょう。

4

2 に答える 2

5

カサンドラの引用-決定的なガイド

列名は、compare_withの値に従ってソートされた順序で格納されます。一方、行は、パーティショナーによって定義された順序で格納されます(たとえば、RandomPartitionerを使用すると、行はランダムな順序になります)。

私はあなたがRandomPartitionerどちらを使用していると思います

...本質的にランダムな順序でデータを返します。

おそらくOrderPreservingPartitioner (OPP)どこで使用する必要があります

したがって、行はキーの順序で格納され、データの物理構造を並べ替え順序に合わせます。

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を巨大なハッシュマップとして使用して、データへの迅速なランダムアクセスを提供します。

于 2011-10-25T19:13:35.713 に答える