2012-10-15 6 views
1

Hector를 사용하여 두 값을 (열 이름으로) 저장하려고합니다. 내가 아는 한, DoubleSerializer와 함께 LONGTYPE 비교기를 사용해야합니다. 비교 자로 ComparatorType.LONGTYPE 및 유효성 검사기로 ComparatorType.UTF8TYPE이있는 columnFamily를 만들었습니다. 내가 이렇게 내 열 가족에 데이터를 삽입 : rowKey이 String 인Cectorandra에서 Hector를 사용하여 double 값을 검색하면 잘못된 결과가 나타납니다.

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

이 colKey가 이중 인 DoubleSerializer을 _ds하고 StringSerializer을 _ss. 긍정적 인 이중 값은 모든 것이 제대로 작동하는 것 같습니다. 그러나 음의 시작 및/또는 종료 매개 변수를 사용하여 범위 쿼리를 수행하려고 할 때 이상한 점이 있습니다. START 마무리가 긍정적 인 경우

SliceQuery<String, Double, String> q = 
      HFactory.createSliceQuery(ks, _ss, _ds, _ss); 
q.setRange(START, FINISH., false, 500); 

이 모든 것이 괜찮 : 이것은 내가 쿼리에 사용하는 코드입니다.

START가 음수이고 FINISH가 양수이면 정확한 양수 값을 반환하지만 실제로 START보다 작은 음수 값만 반환합니다.

모두 음과 시작 (그것이 있어야로!?)를 모두 부정적인 때 마침, 그것이

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

를 던질 것이다, 그러나 START 완료 후 더 큰 작은 경우 (즉, 낮은 음) , 올바른 결과를 반환하지만 잘못된 순서로 표시됩니다 (가장 작은 것, 가장 큰 것, 가장 먼저).

아무도 그것에 대해 언급 할 수 있습니까? 내가 뭔가 잘못하고있는 중이거나 어쩌면 어딘가에서 hector에 버그가있을 수 있습니까?

편집 : 불행히도, DoubleType은 이전 버전의 hector에서 제거되었습니다. 내가 사용하는 버전이 1.1-0이라는 것을 잊어 버렸다.

답변

0

이 문제를 "해결하는 방법"이 없어 보였으므로 저는 hector에 Double 및 Float 형식을 구현했습니다. 그것은 masterbranch로 끌어 당겨졌고, 그러므로 현재 snapshot에서 이용할 수있다. 나는 그것이 다음 릴리스로 나아갈 것으로 가정한다.

1

LongSerializer는 배정 밀도 부동 소수점 숫자로 사용해야하며 64 비트 정수는 동일하지 않습니다. 64 비트 음의 정수가 인코딩이 다르므로 이중화를 예상하는 디시리얼라이저를 사용할 때 이상하게 나오지 않는 것은 놀랍지 않습니다.

관련 문제