我在 Cassandra 2.1.7 中使用 map 类型列。我的要求是我必须保留我在 Cassandra 中插入的值的顺序以供以后检索。为此,我在 Java 中使用了 LinkedHashMap 来达到它的目的。
现在,在调试时我发现顺序一直保留到 Java 处理键值对,但在执行“插入”CQL 命令时,Cassandra 不问我就按升序重新排列映射键,我不喜欢这样:-)
我在 Cassandra 中定义 map 类型时搜索了提供排序选项的方法,但一无所获,因为 map 类型在 Cassandra 中的灵 active 有限。
能否请您提出任何解决方法来满足上述期望!
最佳答案
您说的 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 中包含一个列表类型的列。您可以按照您选择的顺序将键存储在列表中。当您读回行时,您可以遍历列表(按照您选择的顺序),并使用列表值来确定要从 map 中提取哪些键/值对。
关于java - Cassandra 中未排序的 map 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31243793/