3

Cassandra 2.1.7 でマップ タイプ列を使用しています。私の要件は、後で取得できるように、Cassandra に挿入する値の順序を保持する必要があるということです。そのために、その目的を果たす Java で LinkedHashMap を使用しました。

さて、デバッグ中に、Javaがキーと値のペアを処理するまで順序が保持されることがわかりましたが、「挿入」CQLコマンドを実行している間、Cassandraは私に尋ねずにマップキーを昇順で再配置します。これは好きではありません:-)

Cassandra でマップ タイプを定義するときに並べ替えオプションを提供する方法を探しましたが、Cassandra ではマップ タイプの柔軟性が制限されていたため、何も得られませんでした。

上記の期待に応えるための回避策を提案してください!

4

2 に答える 2

3

Cassandra Map (および Set) タイプが順序を保持しないことは正しいです。

aploetz@cqlsh:stackoverflow2> CREATE TABLE maptest 
    (key text PRIMARY KEY, values map<text,text>);
aploetz@cqlsh:stackoverflow2> INSERT INTO maptest (key, values) 
    VALUES ('key1',{'4':'Four','1':'One','2':'Two'});
aploetz@cqlsh:stackoverflow2> SELECT * FROM maptest ;

 key  | values
------+---------------------------------------
 key1 | {'1': 'One', '2': 'Two', '4': 'Four'}

(1 rows)

ただし、リスト型はこれをうまく処理します。

aploetz@cqlsh:stackoverflow2> CREATE TABLE listtest 
    (key text PRIMARY KEY, values list<text>);
aploetz@cqlsh:stackoverflow2> INSERT INTO listtest (key, values) 
    VALUES ('key2',['4','1','2']);
aploetz@cqlsh:stackoverflow2> SELECT * FROM listtest ;

 key  | values
------+-----------------
 key2 | ['4', '1', '2']

(1 rows)

おそらく (回避策として) 試してみることができることは、リスト タイプの列をマップと共に含めることです。選択した順序でキーをリストに保存できます。行を読み戻すと、List を (選択した順序で) 反復処理し、List の値を使用して Map から取得するキー/値のペアを決定できます。

于 2015-07-06T12:28:09.987 に答える