我在Cassandra 2.1.7中使用地图类型列。我的要求是我必须保留我在Cassandra中插入以便以后检索的值的顺序。为此,我在Java中使用了LinkedHashMap来实现其目的。
现在,在调试时我发现订单被保留,直到Java处理键值对,但执行"插入" CQL命令,Cassandra按升序重新排列地图键而不问我,我不喜欢:-)
我在Cassandra中定义地图类型时搜索了提供排序选项,但由于地图类型在Cassandra中的灵活性有限,我一无所获。
请您建议任何解决方法以满足上述期望!
答案 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返回结果的顺序取决于集合中元素的类型。例如,一组文本元素以“字母顺序”返回。如果要按插入顺序返回集合的元素,请使用列表。