2017-02-22 9 views
1

私はCassandraと協力しており、データを行列形式で保存したいと考えています。現在、Listを使用して値を保存しています。 例えば:私はCassandraにマトリックス形式でデータを保存しますか?

CREATE TABLE matrix (row_id int PRIMARY KEY, row_values list<int>); 

テーブル「マトリックス」を作成していると私は、テーブル内のいくつかの値を入力します。 (注意:行と列の数は変更可能)

INSERT INTO matrix (row_id, row_values) values (1, [1,2,3,4,5,6,.......]); 

は、今私はrow_valuesの第二の要素を取得したいが、私の方法で私は、リストの2番目の要素を取得することはできませんよ、しかし私は、クエリの下に使用して要素を更新し、削除することができます。

UPDATE matrix SET row_values[1] = 50 where row_id =1; 

は今、私の質問は、リストから特定の要素を検索することが可能であるかどうか、です。そうでなければ、データを行列形式で格納し、行列から要素を取り出すために使用できる他の方法がありますか?

答えて

2

リストの代わりに使用clustering columncolumn_idとして明示的に列インデックスを指定します。

CREATE TABLE matrix (
row_id int, 
column_id int, 
value int, 
PRIMARY KEY ((row_id), column_id)) 

そして今、あなたは、インサート実行することができます。

INSERT INTO matrix (row_id, column_id, value) VALUES (0, 0, 0); 

またはバッチステートメントを使用して複数の値を挿入します。

BEGIN BATCH 
INSERT INTO matrix (row_id, column_id, value) VALUES (1, 0, 0); 
INSERT INTO matrix (row_id, column_id, value) VALUES (1, 1, 1); 
INSERT INTO matrix (row_id, column_id, value) VALUES (1, 2, 2); 
... 
APPLY BATCH; 

このbatcのすべての文1つのパーティション内で書き込みを実行すると、良好なパフォーマンスが得られます。

SELECT * FROM matrix WHERE row_id = 1; 

しかし、このソリューションは、貧しい人々の側面を有する:

SELECT * FROM matrix WHERE row_id = 1 and column_id=1; 

row_idですべての列を検索:

row_idcolumn_idで値を取得しますが、アプリケーション側でcolumn_idの順序を維持する必要があります。

+0

を使用して取得することができますが、あなたは、手の込んだていただけますか?私は非常に頻繁に操作を実行する必要があります、あなたはあまりにも多くのネットワークオーバーヘッドがあると思いますか? –

+0

バッチ内のすべてのステートメントが1つのパーティション内に書き込まれる場合、コーディネーター・ノードはこのパーティションの特定のノードとのみ通信します。バッチに関するドキュメントを参照してください:https://docs.datastax.com/en/cql/3.3/cql/cql_using/useBatchGoodExample.html –

0

ない回答

あなたは、インデックスを格納する場合でさえ、マップにカサンドラに

をリストから1つだけのインデックス値を選択するにはどのような方法にはないようです。

だからTABLEは次のようになります。..

INSERT INTO matrix (row_id, row_values) values (1, {0:1,1:2,2:3,3:4,4:5,5:6,.......}); 

UPDATEのようになりINSERTは以下のようになり

CREATE TABLE matrix (row_id int PRIMARY KEY, row_values map<int, int>); 

..

UPDATE matrix SET row_values[1] = 50 WHERE row_id = 1; 

または

UPDATE matrix SET row_values = row_values + {1:50} WHERE row_id = 1; 

1つのマップ要素を削除するには..

DELETE row_values[1] FROM matrix WHERE row_id = 1; 

しかし、あなたは、単一のインデックス値を選択することはできません。..

あなたは列としてインデックスを格納する必要があります。これはきれいに見えないが、ここでできることはほとんどない。

このことは、ずっと前から尋ねられてきましたが、何も知られていません。それは良好な性能を持っている理由

しかし、あなたには、いくつかのJAVAプログラムでこれを照会する場合は、その後、あなたは

com.datastax.driver.core.Row.getMap() 
関連する問題