使用Hector从Cassandra检索(负)双值会给出错误的结果



我想使用Hector存储双值(作为列名)。据我所知,我必须将LONGTYPE比较器与DoubleSerializer结合使用。我创建了一个列Family,用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较小(应该是!?)时,FINISH将抛出

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

当两者都为负,但START大于FINISH(即负性较小)时,它将返回正确的结果,但顺序错误(负性最小,即最大,第一)。

有人能对此发表评论吗?我是做错了什么,还是赫克托的某个地方有窃听器?

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

您应该使用LongSerializer,因为双精度浮点数和64位整数是不同的。当使用反序列化器时,64位负整数会奇怪地出现,这一点也不奇怪,因为编码不同。

由于似乎没有办法"解决"这个问题,我为hector实现了Double和Float格式。它已被拉入主分支,因此在当前快照中可用。我想它也会进入下一个版本。

相关内容

最新更新