Cassandra

时间:2015-07-06 10:42:42

标签: java cassandra cql cassandra-2.0 cassandra-jdbc

我在Cassandra 2.1.7中使用地图类型列。我的要求是我必须保留我在Cassandra中插入以便以后检索的值的顺序。为此,我在Java中使用了LinkedHashMap来实现其目的。

现在,在调试时我发现订单被保留,直到Java处理键值对,但执行"插入" CQL命令,Cassandra按升序重新排列地图键而不问我,我不喜欢:-)

我在Cassandra中定义地图类型时搜索了提供排序选项,但由于地图类型在Cassandra中的灵活性有限,我一无所获。

请您建议任何解决方法以满足上述期望!

2 个答案:

答案 0 :(得分:2)

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)

然而,List类型处理这个很好:

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)

或许(作为一种解决方法)您可以尝试的方法是在Map中包含List类型的列。您可以按照您选择的顺序将密钥存储在列表中。当你读回你的行时,你可以遍历List(按照你选择的顺序),并使用List值来确定从Map中提取哪些键/值对。

答案 1 :(得分:1)

Cassandra返回结果的顺序取决于集合中元素的类型。例如,一组文本元素以“字母顺序”返回。如果要按插入顺序返回集合的元素,请使用列表。

You can find more details from Datastax's Docs Page