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" 中返回一组文本元素。如果您希望集合中的元素按插入顺序返回,请使用列表。
我在 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" 中返回一组文本元素。如果您希望集合中的元素按插入顺序返回,请使用列表。