2012-07-19 2 views
1

Hector가 키와 컬럼 이름에서 제어 문자를 처리하는 데 문제가 있습니다. 저는 Cassandra 인스턴스와 대화하기 위해 Hector를 사용하는 프로그램을 작성하고 있습니다. 기존의 Keys 및 Column 이름이 있습니다. 16 진수 "594d69e0b8e611e10000242d50cf1ff7".Hector가 Java String에서 제어 문자를 올바르게 처리하지 않습니다 - 텍스트 문자열 대신 Hector에서 16 진수를 얻는 방법?

내가 자바 문자열로 그 진수를 입력하고 몇 가지 간단한 변환 - 텍스트 코드를 통해 연결 한 : hexString.append (정수를 호출하여 진수로 다시 돌아 자바 문자열 변환

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < s1.length() - 1; i+=2){ 
    /*Grab the hex in pairs*/ 
    String output = s1.substring(i, (i + 2)); 
    /*Convert Hex to Decimal*/ 
    int decimal = Integer.parseInt(output, 16);     
    sb.append((char)decimal);    
}    
return sb.toString(); 

(. toHexString (textString.charAt (i))); 모든 문자에 대해 Java가이 데이터를 처리 할 수 ​​있도록 원래의 16 진수를 반환합니다.) Java 문자열을 인쇄하면 아래 이미지의 맨 위 줄이 나타납니다.

[ 새 사용자가 이미지를 게시 할 수 없기 때문에 이미지가 게시되지 않았습니다.]여기이미지 :

OrderedRows<String, String, String> orderedRows; 
orderedRows = rangeSlicesQuery.execute().get(); 
Row<String,String,String> lastRow = orderedRows.peekLast(); 
for (Row<String, String, String> r : orderedRows) { 
    String key = r.getKey(); 
    System.out.println(key); 
... 
: http://i.stack.imgur.com/yUJxs.png

불행하게도, 결론 (손상)이 나는이 코드를 다음 호출 할 때 헥터 (검사 및 설정을 많이 생략 문제의 단순화를 위해) 나에게 반환하는 것입니다

따라서 Hector는 Java String을 반환 할 때 제어 문자를 올바르게 처리하지 않습니다. 어떻게하면 헥터가 키와 컬럼을 16 진수에 텍스트 기반 자바 문자열 대신 나에게 돌려 줄 수 있을까요? 내가 그것을 보려고했지만 그렇게하는 방법에 대한 설명서는 본질적으로 누락되었습니다 (http://hector-client.github.com/hector//source/content/API/core/1.0-1/me/prettyprint/hector/api/beans/OrderedRows.html - K, V, N은 무엇입니까?). Cassandra CLI가 ascii ('')로 입력을 감싸지 않는다면 16 진수로 가정하기 때문에 단순해야한다고 상상합니다. 그러나 어떻게해야하는지 알 수는 없습니다.

답변

0

카산드라에서는 모든 것이 16 진수 바이트로 저장됩니다. Cassandra 중고품 API도 바이너리를 허용합니다. 그러나 실생활에서 사람들은 문자열, 정수 등과 같은 인간 유형을 다루는 것을 좋아합니다. Hector는 직렬화/비 직렬화 논리를 추상화하여 Thrift API를 쉽게 사용할 수 있도록합니다.

K, N 및 V는 각각 행 키, 열 이름 및 열 값의 유형입니다. String, String, String을 사용할 때, 여러분은 여러분의 열 패밀리에 대한 세 가지 유형 모두가 String이라는 것을 hector에게 말하고 있습니다.

행 키와 열 이름을 바이트로 저장하는 경우 검색을 위해 byte [] 대신 직렬화를 위해 BytesArraySerializer를 사용해야합니다.