私は私が言うことができるカサンドラ
に新たなんです。最初の手がかりは、あなたの結果の順序だった。 id
を単独のPRIMARY KEY(パーティションキーにする)として使用すると、そのようなソート結果が返されることはありません。 このは、彼らがソートする方法である。
[email protected]:stackoverflow> SELECT id,orderby,token(id) FROM testtable ;
id | orderby | system.token(id)
-----+---------+---------------------
102 | 2 | -963541259029995480
105 | 3 | 2376737131193407616
101 | 1 | 4965004472028601333
(3 rows)
結合していないクエリは常にパーティション・キーのハッシュ化されたトークン値によってソートされた結果を返します。これを表示するには、パーティションキー(id
)に関数を実行しました。
私は、同じ順序で次のID 105,102,103の既存の順序を変更したいと考えています。すなわち、(105,1)(102,2)(103,3)である。
あなたがする必要があるすべてはそれは簡単です、orderby
列の値を変更している場合:
[email protected]:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('101',3);
[email protected]:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('102',2);
[email protected]:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('105',1);
[email protected]:stackoverflow> SELECT id,orderby,token(id) FROM testtable ;
id | orderby | system.token(id)
-----+---------+---------------------
102 | 2 | -963541259029995480
105 | 1 | 2376737131193407616
101 | 3 | 4965004472028601333
(3 rows)
カサンドラ主キーは、単にそのキーの新しい非キー列の値を挿入する、ユニークであるため変更orderby
。
実際に結果をorderby
列で並べ替えることができるようにするには、これはまったく別の問題であり、現在のモデルでは解決できません。
本当にやりたいことなら、別のPRIMARY KEY定義を持つ新しいテーブルが必要です。そこで、同じテーブルに2つの変更を加えて作成します:testtable_by_group
という名前を付けて、PRIMARY KEY (group,orderby,id))
の複合プライマリキーを使用します。今私は特定のグループ "group1"を照会し、ソートされた結果を見ることができます。
[email protected]:stackoverflow> CREATE TABLE testtable_by_group (group text,id text,orderby int,PRIMARY KEY (group,orderby,id));
[email protected]:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','101',3);
[email protected]:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','102',2);
[email protected]:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','105',1);
[email protected]:stackoverflow> SELECT group,id,orderby,token(group) FROM testtable_by_group WHERE group='group1';
group | id | orderby | system.token(group)
--------+-----+---------+----------------------
group1 | 105 | 1 | -2413872665919611707
group1 | 102 | 2 | -2413872665919611707
group1 | 101 | 3 | -2413872665919611707
(3 rows)
このように、group
は新しいパーティションキーです。 orderby
が最初のクラスタリングキーなので、group
の行は自動的にソートされます。 2つの行に同じorderby
がある場合、id
は一意性を保証するために最後にあります。
私は機能を結果セットに残しましたが、新しいパーティションキー(group
)で実行したことに注意してください。ご覧のとおり、group1
のキーは3行すべてに対して同じトークンにハッシュされます。つまり、マルチノード環境では3行すべてが一緒に格納されます。これにより、クラスタ内に「ホットスポット」が作成され、ノードの中には他のノードより多くのデータがあるものがあります。そのため、良好なPRIMARY KEY定義によって、クエリの満足度が保証されます。とのデータ配信が保証されます。
私はDataStaxの記事を書きました。それを読むと、助けてくれるはずです:http://www.datastax.com/dev/blog/we-shall-have-order
あなたの質問を編集して 'CREATE TABLE'文を入れることはできますか? SQLの世界から考えているように、これが実際に動作する唯一の方法は、すべてが同じパーティションキーを共有する場合です。それでも、それはあなたのクラスタ化キーが何であるかによって異なります。 – Aaron
テーブルの作成を追加しました – Rami
また、カーディナリティの高い2次インデックスを使用すると、パターンが崩れます。値の範囲によっては、 'dept'と' group'は大丈夫かもしれませんが、 'user'と' date'は一意になりすぎてうまく動作しません。 – Aaron