2014-04-27 3 views
2

Nutch 2.2.1 및 Cassandra 2를 사용하여 페이지를 크롤링하고 있습니다. 테스트를 위해 저는 카산드라에게 하나의 URL을 삽입하고 데이터베이스를 탐색합니다. 내가 웹 페이지의 키 스페이스에쿼리 nutch 2 테이블 결과 cassandra 2 복용량이 올바르지 않습니다.

cqlsh을 테이블을 조회 할 수 있습니다 CQL을 사용하여

: 단면>을 선택 * webpage.f에서;

key         | column1 | value 
--------------------------------------+---------+-------------------- 
0x6564752e6373752e7777773a687474702f | 0x6669 |   0x00278d00 
0x6564752e6373752e7777773a687474702f | 0x73 |   0x3f800000 
0x6564752e6373752e7777773a687474702f | 0x7473 | 0x00000145a266703e 

이 16 진수 바이트를 문자열로 변환하면 문제가 없습니다. 열쇠는 되 돌린 URL이 될 것입니다.

는 난 결과는 아래와 같다 샘플 코드

Cluster cluster = Cluster.builder().addContactPoint("10.20.104.181").build(); 
Session session = cluster.connect(); 
ResultSet results = session.execute("SELECT * FROM webpage.f"); 
for (Row row : results) { 

      System.out.println("Key"); 
     System.out.println(toStrFromByteBuffer(row.getBytes("key"))); 
     System.out.println("column1"); 
     System.out.println(toStrFromByteBuffer(row.getBytes("column1"))); 
     System.out.println("value"); 
     System.out.println(toStrFromByteBuffer(row.getBytes("value"))); 

} 
cluster.close(); 



public static String toStrFromByteBuffer(ByteBuffer buffer) 
    { 
     byte[] ar=buffer.array(); 
     System.out.println(ar.length); 
     return new String(ar,Charset.forName("UTF-8")); 
    } 

따라 datastax 자바 드라이버 2 (http://www.datastax.com/documentation/developer/java-driver/2.0/java-driver/whatsNew2.html)

F를 이용하여 테이블을 판독하는 자바 코드 물품. row.getBytes ("key")가 특정 열 값이 아닌 전체 행 데이터를 반환하는 것을 볼 수 있습니다.

일부 마스터가이 문제에 도움을 줄 수 있습니까?

enter image description here

+0

안녕하세요, 지금 동일한 문제가 있습니다. 나는 Nutch 2.2.1과 Cassandra 1.2.9를 사용하고 있습니다. 왜 데이터가 16 진수 형식으로 저장되는지 모르겠습니다. UTF-8로하고 싶습니다. 이거 해결 했니? –

답변

0

는 Nutch는 BytesType 같이 F 열 가족 데이터를 저장한다. 열 이름은 UTF8Type으로 저장됩니다. 문자열로 데이터를 가져 오려면 먼저 변환해야합니다. 행은 ByteBuffer에 완전히 저장됩니다. 귀하의 예제에서 전체 바이트 버퍼를 String으로 변환하여 전체 행을 제공합니다. 한 행을 선택하면 해당 행의 한도에 현재 위치가 표시됩니다. 따라서 begin : buffer 현재 포인터 위치에서 buffer limit까지 읽어야합니다. 예를 들어 'cnt'입력란에 웹 사이트 콘텐츠를 가져 오는 경우 :

// This is the byte buffer you get from selecting column "cnt" 
ByteBuffer buffer; 
int length = buffer.limit() - buffer.position(); 

byte[] cellValue = new byte[length]; 

buffer.get(cellValue, 0, length); 

return new String(cellValue, Charset.forName("UTF-8"));