Извлечение (отрицательных) двойных значений из Кассандры с использованием Гектора дает неправильные результаты

Я хочу хранить двойные значения (как имена столбцов), используя Hector. Насколько я понимаю, я должен использовать компаратор LONGTYPE в сочетании с DoubleSerializer. Я создал columnFamily с ComparatorType.LONGTYPE в качестве компаратора и ComparatorType.UTF8TYPE в качестве валидатора. Я вставляю данные в семейство столбцов следующим образом:

Mutator<String> m = HFactory.createMutator(_keyspace, _ss);
m.addInsertion(rowKey, cf, HFactory.createColumn(colKey, "", _ds, _ss));

где rowKey — это String, colKey — это double, _ds — это DoubleSerializer и _ss — это StringSerializer. Кажется, все работает для положительных двойных значений. Однако, когда я хочу выполнять запросы диапазона с отрицательными параметрами начала и/или окончания, все становится странным. Это код, который я использую для запроса:

SliceQuery<String, Double, String> q = 
          HFactory.createSliceQuery(ks, _ss, _ds, _ss);
q.setRange(START, FINISH., false, 500);

Когда СТАРТ и ФИНИШ положительны, все в порядке.

Когда START имеет отрицательное значение, а FINISH положительное, будут возвращены правильные положительные значения, но только те отрицательные значения, которые на самом деле меньше, чем START.

Когда оба отрицательные и START меньше (как и должно быть !?), затем FINISH, он выдаст

InvalidRequestException(why:range finish must come after start in the order of traversal).

Когда оба являются отрицательными, но START больше, чем FINISH (т.е. менее отрицательный), он вернет правильные результаты, но в неправильном порядке (наименее отрицательный, т.е. самый большой, первый).

Кто-нибудь может это прокомментировать? Я что-то не так делаю или может где-то в гекторе ошибка?

Редактировать: К сожалению, DoubleType был удален в предыдущей версии hector. Я забыл упомянуть, что я использую версию 1.1-0.


person feob    schedule 15.10.2012    source источник


Ответы (2)


Вы должны использовать LongSerializer, так как число с плавающей запятой двойной точности и 64-битное целое число не совпадают. Совсем неудивительно, что 64-битные отрицательные целые числа будут выглядеть странно при использовании десериализатора, ожидающего удвоения, поскольку кодировка отличается.

person rs_atl    schedule 15.10.2012

Поскольку, казалось, не было никакого способа «решить» эту проблему, я реализовал форматы Double и Float для hector. Он был перенесен в главную ветку и поэтому доступен в текущем моментальном снимке. Я предполагаю, что он появится и в следующем релизе.

person feob    schedule 27.10.2012