Cassandra 中未排序的地图类型

Unsorted Map type in Cassandra

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

现在,在调试时我发现顺序一直保留到 Java 正在处理键值对,但是在执行 "insert into" CQL 命令时,Cassandra 不问我就按升序重新排列映射键,我不喜欢 :-)

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

能否请您提出任何解决方法来满足上述期望!

你说得对,Cassandra Map(和 Set)类型不保持顺序。

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

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

(1 rows)

然而,List 类型可以很好地处理这个问题:

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

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

(1 rows)

也许(作为解决方法)您可以尝试在地图中包含一个列表类型的列。您可以按照您选择的顺序将键存储在列表中。当您读回您的行时,您可以遍历列表(这将按照您选择的顺序),并使用列表值来确定要从地图中提取哪些 key/value 对。

Cassandra returns 根据集合中元素的类型生成顺序。例如,在 "alphabetical order" 中返回一组文本元素。如果您希望集合中的元素按插入顺序返回,请使用列表。

You can find more details from Datastax's Docs Page