2017-01-16 11 views
1

したがって、私はいくつかの統計をcassandraに保存しています。 特定の列に基づいて上位10個のエントリを取得したいと考えています。この場合の列はkillsです。CassandraのORDER BYが期待通りに機能しない

mysqlのようにORDER BYコマンドがないので、私はPARTITION KEYを作成する必要があります。

私は、次の表を作成しました:

CREATE TABLE IF NOT EXISTS stats (uuid uuid, kills int, deaths int, playedGames int, wins int, srt int, PRIMARY KEY (srt, kills)) WITH CLUSTERING ORDER BY (kills DESC); 

あなたは上記を参照として私が持っている問題は、以下の通りです、私は順序の列srtを使用しています私が使用するつもりだときので、列uuidを注文すると、私の選択クエリの結果は完全にランダムであり、期待どおりにソートされません。

私はPARTITION KEYと常に同じ値を持つ列を追加しようとしました。並べ替えは今は機能しますが、実際にはうまくいきません。私は今SELECT * FROM stats;にしようとすると、結果は以下の通りです:

srt | kills | deaths | playedgames | uuid         | wins 
-----+-------+--------+-------------+--------------------------------------+------ 
    0 | 49 |  35 |   48 | 6f284e6f-bd9a-491f-9f52-690ea2375fef | 2 
    0 | 48 |  21 |   30 | 4842ad78-50e4-470c-8ee9-71c5a731c935 | 4 
    0 | 47 |  48 |   14 | 91f41144-ef5a-4071-8c79-228a7e192f34 | 42 
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
    0 |  2 |  32 |   20 | 387448a7-a08e-46d4-81a2-33d8a893fdb6 | 31 
    0 |  1 |  16 |   17 | fe4efbcd-34c3-419a-a52e-f9ae8866f2bf | 12 
    0 |  0 |  31 |   25 | 82b13d11-7eeb-411c-a521-c2c2f9b8a764 | 10 

結果についての問題は、一つだけの行があると、「キルあたり」AMOUT /値ということ、である - しかし、間違いなくもっとあるはずです。

Cassandraでソートを使用してデータを取り除くことについての考え方はありますか?

私はquerysでsolrをサポートするDatastax Enterprise(DSE)について聞いたことがありますが、DSEは非生産的(しかも6ヶ月間のみ)で無料です。有料版は、少なくとも私が聞いたことはかなり高価です(ノードあたり約$ 4000)。ですから、Datastax Enterprise Community Edtionのような代替手段はありますか?意味がありませんが、私は尋ねています。私はグーグルで何かを発見していない、私はまた、 "正常な"カサンダとソルを使用できますか?

ありがとうございました!

PS:これは私には役に立たなかったので、order by caluse not working in Cassandra queryの重複としてマークしないでください。私はすでに解決のために1時間半のようにグーグルで探検した。

EDIT

ので、私の主キーは(srt, kills)の組み合わせは一意である必要があり、PRIMARY KEY(srt, kills)であるという事実を。どちらが基本的には、同じamoutの行がkillsであり、互いに上書きされていることを意味します。私はPRIMARY KEY(uuid, kills)を使用して行を上書きする問題を解決しますが、SELECT * FROM stats LIMIT 10を実行すると、結果は完全にランダムであり、killsでソートされません。

答えて

0
  1. ソート用に列を使用する場合は、パーティションキーから取得します。行は、すべてのパーティション内でこの列でソートされます - カサンドラは、パーティション・キーを使用してノード間でデータを分割し、クラスタ化キーを使用して、各パーティションでそれを注文:

    PRIMARY KEY((SRT)、殺す)

編集: あなたはもう少しコンセプトを理解する必要があります、私はあなたがDSEサイトでいくつかの無料コースを取ることをお勧めします、それはさらなる発展にあなたを助けることができます。

とにかく、あなたの質問について: プライマリキーは、各行を一意にする列のセットです。 この主キーパーティションキー列とクラスタリング列には、2種類の列があります。 並べ替えや範囲照会にパーティションキーを使用することはできません。これはCassandraのモデルに対するものです。このような照会は複数のノード、またはすべてのノードとsstablesに分割されます。並べ替えに列挙された両方の列を使用する場合は、パーティショニングに別の列(たとえば1〜100の乱数)を使用し、各「バッチ」に対してクエリを実行するか、単に別の列を使用する必要があります(100以上)、データはそのような値の間で均等に分散され、これらの値をすべて使用してデータにアクセスされます。そうしないと、ホットノード/パーティションになります。

プライマリキー((another_column)、SRTを殺す)

あなたが理解する必要がどのような、あなただけのパーティション内のデータを注文し、ではなくパーティション間ですることができます。

  1. "per kill"アマウント/値 - あなたは精緻化できますか?カサンドラの各キーには1つの行しかありません。同じキーで複数の行を挿入すると、最後の挿入値で上書きされます(upsertsについて読む)。
+0

まあ、私はちょっとばかです。 'kills'は' PRIMARY KEY'なので、あなたがすでに書いたように、もう一つは上書きされているので、約50行しかないのは正しいです。 私の問題は今、 'PRIMARY KEY'にはならない特定の列をソートしたいのですが、' PRIMARY KEY'でなければなりません。何か案は? –

+0

私は自分の質問を編集しました。あなたが今理解していることを願っています。私の問題は何か - 不明な点がありましたら申し訳ありません。 –

関連する問題