使用Hector从Cassandra中检索(负)双值会得到错误的结果

时间:2012-10-15 14:49:45

标签: java cassandra double hector

我想使用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为负且FINISH为正时,它将返回正确的正值,但只返回那些实际上小于START的负值。

当两者都是负数并且START较小时(应该是!?)然后完成,它会抛出一个

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

如果两者都是负数,但是START大于FINISH(即负值较小),它将返回正确的结果,但顺序错误(最小的负数,即最大的,第一个)。

有人可以对此发表评论吗?我做错了什么,或者某个地方可能有一个错误?

编辑:不幸的是,DoubleType已在先前版本的hector中删除。我忘了提到Im使用的版本是1.1-0。

2 个答案:

答案 0 :(得分:1)

您应该使用LongSerializer,因为双精度浮点数和64位整数不相同。当使用期望双精度的解串器时,64位负整数会出现奇怪的现象并不奇怪,因为编码是不同的。

答案 1 :(得分:0)

由于似乎没有办法“解决”这个问题,我已经为hector实现了Double和Float格式。它已被拉入masterbranch,因此可用于当前snapshot 。 我认为它也会进入下一个版本。