1

我想使用 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 更小(应该是!?)然后 FINISH,它会抛出一个

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

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

任何人都可以对此发表评论吗?我做错了什么还是赫克托某处可能有错误?

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

4

2 回答 2

1

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

于 2012-10-15T18:23:33.963 回答
0

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

于 2012-10-27T13:47:53.067 回答