Несортированный тип карты в Cassandra

Я использую столбец типа карты в Cassandra 2.1.7. Мое требование состоит в том, что я должен сохранить порядок значений, которые я вставляю в Cassandra, для последующего поиска. Для этого я использовал LinkedHashMap в Java, который служит своей цели.

Теперь, во время отладки, я обнаружил, что порядок сохраняется до тех пор, пока Java не обрабатывает пары ключ-значение, но при выполнении команды «вставить в» CQL Cassandra переставляет ключи карты в порядке возрастания, не спрашивая меня, что мне не нравится :-)

Я искал варианты сортировки при определении типов карт в Cassandra, но ничего не получил, поскольку типы карт в Cassandra имеют ограниченную гибкость.

Не могли бы вы предложить какой-либо обходной путь, чтобы оправдать вышеуказанные ожидания!


person tom    schedule 06.07.2015    source источник


Ответы (2)


Вы правы в том, что тип 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)

Возможно (в качестве обходного пути) вы могли бы попробовать включить столбец типа «Список» вместе с вашей картой. Вы можете хранить ключи в списке в выбранном вами порядке. Когда вы читаете свою строку обратно, вы можете выполнить итерацию по списку (который будет в выбранном вами порядке) и использовать значения списка, чтобы определить, какие пары ключ/значение извлекать из карты.

person Aaron    schedule 06.07.2015
comment
Спасибо за предложение этого обходного пути, я попробую и скоро опубликую результаты! - person tom; 06.07.2015

Cassandra возвращает результаты в порядке, основанном на типе элементов в коллекции. Например, набор текстовых элементов возвращается в «алфавитном порядке». Если вы хотите, чтобы элементы коллекции возвращались в порядке вставки, используйте список.

Дополнительную информацию можно найти на странице документации Datastax

person Ergin    schedule 07.11.2018