2016-12-22 5 views
1

こんにちは私はカサンドラに同様のテーブルを持っている:カサンドラ:異なる値で更新し、複数の行が

CREATE TABLE TestTable(id text, 
     group text, 
     date text, 
     user text, 
     dept text, 
     orderby int, 
     files list<text>, 
     users list<text>, 
     family_memebrs list<frozen <member>>, 
     PRIMARY KEY ((id)));' 
CREATE INDEX on TestTable (user); 
CREATE INDEX on TestTable (dept); 
CREATE INDEX on TestTable (group); 
CREATE INDEX on TestTable (date); 

Id | OrderBy 
:---- | :---- 
101 | 1 
102 | 2 
105 | 3 

は私が同じ順序でのID 105102103を以下のためにすることで、既存の順序を変更したいです。すなわち、(105,1)(102,2)(103,3)である。私はカサンドラを初めて知りました。私を助けてください。私はrownumを使用してSQLで可能であると思う。

+0

あなたの質問を編集して 'CREATE TABLE'文を入れることはできますか? SQLの世界から考えているように、これが実際に動作する唯一の方法は、すべてが同じパーティションキーを共有する場合です。それでも、それはあなたのクラスタ化キーが何であるかによって異なります。 – Aaron

+0

テーブルの作成を追加しました – Rami

+0

また、カーディナリティの高い2次インデックスを使用すると、パターンが崩れます。値の範囲によっては、 'dept'と' group'は大丈夫かもしれませんが、 'user'と' date'は一意になりすぎてうまく動作しません。 – Aaron

答えて

2

私は私が言うことができるカサンドラ

に新たなんです。最初の手がかりは、あなたの結果の順序だった。 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

+0

ありがとうございます。要件が変更され、Postgresに切り替えられました – Rami

関連する問題