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)

但是 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 类型的列。您可以按照您选择的顺序将密钥存储在列表中。当您读回您的行时,您可以遍历列表(按照您选择的顺序),并使用列表值来确定要从 Map 中提取哪些键/值对。

于 2015-07-06T12:28:09.987 回答
1

Cassandra 根据集合中元素的类型按顺序返回结果。例如,一组文本元素按“字母顺序”返回。如果您希望按插入顺序返回集合的元素,请使用列表。

您可以从 Datastax 的文档页面找到更多详细信息

于 2018-11-07T06:28:38.160 回答