2015-07-06 3 views
1

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

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

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

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

ответ

2

Вы правы, что тип карты Cassandra (и Set) не сохраняет порядок.

[email protected]:stackoverflow2> CREATE TABLE maptest 
    (key text PRIMARY KEY, values map<text,text>); 
[email protected]:stackoverflow2> INSERT INTO maptest (key, values) 
    VALUES ('key1',{'4':'Four','1':'One','2':'Two'}); 
[email protected]:stackoverflow2> SELECT * FROM maptest ; 

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

(1 rows) 

Тип список, однако, обрабатывает это просто отлично:

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

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

(1 rows) 

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

+0

Спасибо, что предложили это обходное решение, я дам ему хит и опубликую результаты в ближайшее время! – tom

+1

Это работает! Благодаря ! – tom