1

Hector を使用して double 値を (列名として) 格納したいと考えています。私が理解している限り、LONGTYPE コンパレーターを DoubleSerializer と組み合わせて使用​​する必要があります。ComparatorType.LONGTYPE をコンパレータとして、ComparatorType.UTF8TYPE をバリデータとして columnFamily を作成しました。次のように列ファミリーにデータを挿入します。

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

ここで、rowKey は String、colKey は double、_ds は DoubleSerializer、_ss は StringSerializer です。すべてが正の double 値に対して機能するようです。ただし、負の開始パラメータや終了パラメータを使用して範囲クエリを実行したい場合、状況は奇妙になります。これは、クエリに使用するコードです。

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 よりも大きい (つまり、負の値が小さい) 場合、正しい結果が返されますが、順序が間違っています (最小の負、つまり最大のものが最初)。

誰もそれについてコメントできますか?私は何か間違ったことをしていますか、それともヘクターのどこかにバグがあるのでしょうか?

編集: 残念ながら、以前のバージョンの hector では DoubleType が削除されました。私が使用しているバージョンが 1.1-0 であることを忘れていました。

4

2 に答える 2

1

倍精度浮動小数点数と 64 ビット整数は同じではないため、LongSerializer を使用する必要があります。エンコーディングが異なるため、double を期待するデシリアライザーを使用すると、64 ビットの負の整数が奇妙に出力されることはまったく驚くべきことではありません。

于 2012-10-15T18:23:33.963 に答える
0

この問題を「解決」する方法がないように思われたので、hector に Double および Float 形式を実装しました。masterbranch にプルされているため、現在のスナップショットで使用できます。次のリリースにも反映されると思います。

于 2012-10-27T13:47:53.067 に答える