Почему я вставляю столбец double/float в Cassandra с помощью hector и получаю неверное значение в базе данных

У меня есть вопрос о Гекторе. Вставьте данные типа double/float в Cassandra.

new Double("13.45")------->13.468259733915328
new Float("64.13") ------->119.87449

Когда я вставляю данные в Cassandra по Гектору

TestDouble ch = new TestDouble("talend_bj",
        "localhost:9160");
String family = "talend_1";
ch.ensureColumnFamily(family);
List values = new ArrayList();
values.add(HFactory.createColumn("id", 2, StringSerializer.get(),
        IntegerSerializer.get()));
values.add(HFactory.createColumn("name", "zhang",
        StringSerializer.get(), StringSerializer.get()));
values.add(HFactory.createColumn("salary", 13.45,
        StringSerializer.get(), DoubleSerializer.get()));
ch.insertSuper("14", values, "user1", family, StringSerializer.get(),
        StringSerializer.get());
StringSerializer se = StringSerializer.get();
MultigetSuperSliceQuery<String, String, String, String> q = me.prettyprint.hector.api.factory.HFactory
        .createMultigetSuperSliceQuery(ch.getKeyspace(), se, se, se, se);
// q.setSuperColumn("user1").setColumnNames("id","name")
q.setKeys("12", "11","13", "14");
q.setColumnFamily(family);
q.setRange("z", "z", false, 100);
QueryResult<SuperRows<String, String, String, String>> r = q
        .setColumnNames("user1", "user").execute();
Iterator iter = r.get().iterator();
while (iter.hasNext()) {
    SuperRow superRow = (SuperRow) iter.next();
    SuperSlice s = superRow.getSuperSlice();
    List<HSuperColumn> superColumns = s.getSuperColumns();
    for (HSuperColumn superColumn : superColumns) {
        List<HColumn> columns = superColumn.getColumns();
        System.out.println(DoubleSerializer.get().fromBytes(((String) superColumn.getSubColumnByName("salary").getValue()).getBytes()));
    }
}

Вы можете видеть 13,45, но я получаю значение столбца 13,468259733915328.


person Josh Zhao    schedule 28.09.2012    source источник


Ответы (1)


Вы должны разбить проблему на две части. После написания, ЕСЛИ вы определили часть своей схемы ИЛИ использовали ключевое слово ASSUME в командной строке cli, просмотрите данные в cassandra, чтобы убедиться, что они верны. В PlayOrm есть этот ТОЧНЫЙ модульный тест (который находится в PlayOrm поверх astyanax, а не hector), и он работает просто отлично... Обратите внимание на сравнение в тесте -200.23...

https://github.com/deanhiller/playorm/blob/master/input/javasrc/com/alvazan/test/TestColumnSlice.java

После сбоя ваши данные в cassandra выглядят правильно? Если это так, проблема заключается в том, что вы читаете значение в коде, в противном случае это запись.

person Dean Hiller    schedule 28.09.2012
comment
Спасибо за ответ. Я проверил результат в базе данных, он правильный. При чтении записи получают неверный результат. - person Josh Zhao; 08.10.2012