2012-08-06 3 views
1

Я сохранил данные в ComparatorType.BYTESTYPE в базе данных Cassandra. Теперь я хочу получить данные в сохраненном порядке.Получение результатов от Cassandra в порядке

Я использовал следующий код в Hector для получения данных, но результаты запроса не отсортированы.

Keyspace keyspace = HFactory.createKeyspace("ClusterName", cluster); 

Map<String, String> resultMap = new HashMap<String, String>(); 

SliceQuery<String, String, String> query = HFactory.createSliceQuery(keyspace, StringSerializer.get(), StringSerializer.get(), StringSerializer.get()); 
query.setColumnFamily("ColumnFamilyName").setKey("RowKey") 
.setRange("", "", false, Integer.MAX_VALUE); 
QueryResult<ColumnSlice<String, String>> result = query.execute(); 

for (HColumn<String, String> column : result.get().getColumns()) { 
     resultMap.put(column.getName(), column.getValue()); 
} 

что мне не хватает ?? Нужно ли использовать RangeSliceQueries и OrderedRows?

Заранее спасибо.

ответ

1

Все зависит от компаратора, установленного для имен столбцов. Если это BytesType (по умолчанию для cassandra), то это будет не тот порядок, который вы ожидаете.

если вы хотите алфавитный порядок, вы должны определить таблицу с чем-то вроде, что в Кассандре-кли:

создать столбец семьи ColumnFamilyName с компаратором = UTF8Type;

или вы все еще во времени возможно сделать

обновления столбца семьи ColumnFamilyName с компаратором = UTF8Type;

0

Спасибо, douard за ваш ответ.

Но я решил это, изменив коллекцию на LinkedHashMap вместо HashMap. Как я заметил,

result.get().getColumns() 

дает результаты в порядке, но, как HasMap не сохраняет порядок вставки, результаты получить неупорядоченный. Таким образом, приведенный выше код отлично работает при изменении HashMap на LinkedHashMap.

Map<String, String> resultMap = new LinkedHashMap<String, String>(); 
+0

Похоже, ваше решение хорошо работает в вашем случае, но я думаю, что это просто совпадение с порядком вставки и типами данных. Во что бы то ни стало придерживайтесь предлагаемого вами решения, но я бы пошел с решением ле-даура в качестве общего правила. –

Смежные вопросы