java - Cassandra 中未排序的 map 类型

标签 java cassandra cql cassandra-2.0 cassandra-jdbc

我在 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/

相关文章:

java - spring 基于注解的配置——内存消耗太高?

cassandra - 列的注释 @ClusteringColumn 的排序值无效?

node.js - Cassandra:操作超时

"select * from CF where column in (..,..,..)"的 python CQL 查询替换

Cassandra 防止重复

java - Map<Class<?>, Object> 注册表

java - 线程缓存和 Java 内存模型

java - 为什么将 arrayList 对象输出到 JtextArea 的尝试不起作用?

node.js - 是否可以将 Cassandra 与 Node.js 一起使用?

sql - 根据 id 匹配时另一个表中的值更新表中的列