2012-05-14 2 views
1

'default'라는 열 패밀리와 'details'한정자가 하나만있는 'mytable'이라는 hbase 테이블이 있습니다.Hbase 셸 : 값이 잘립니다.

get 'mytable', 'test' 

그리고 결과의 값 절단 :

는 지금은이 쿼리를 수행합니다.

COLUMN      CELL                   
default:details   timestamp=1337007859494, value=\x00\x00\x00\x00\x00\x00\xDFH     
1 row(s) in 0.0360 seconds 

왜 난 단지 처음 7 바이트를 볼 수 있습니까 : 그것은 (긴) 숫자를해야 하는가? 어떻게 전체 가치를 볼 수 있습니까?

작은 값으로 요청하면 작동합니다. 그러나 큰 가치는 불완전합니다.

+0

값을 삽입하는 방법은 무엇입니까? –

+0

값은 Java로 작성된 맵 축소 작업에 의해 삽입됩니다. – yoooshi

+0

잘못된 값이 삽입되지 않도록 MR 작업을 삽입하기 직전에 값을 인쇄하도록 할 수 있습니까? 또한 jruby 셸에 문제가 없는지 확인하려면 java 파일을 사용하여 값을 읽으십시오. –

답변

4

모든 8 바이트는 문자열에 있습니다 쉽게

\x00\x00\x00\x00\x00\x00\xDFH 

이 방법으로 볼 수 :

\x00 \x00 \x00 \x00 \x00 \x00 \xDF H 

을 첫 6 바이트 0 (16 진수의 \의 x00에서), 다음 하나 223 (16 진수 \ xDF)이고 마지막 문자는 ASCII H (\ x48)이므로 십진법으로 길이가 57,160입니다. HBase의 값은 문자 배열이며 형식을 인식 할 수 없으므로 쉘은 인쇄 가능한 ASCII가 아닌 모든 바이트를 16 진수로 이스케이프 처리하고 항상 깨끗한 것은 아닙니다.

+0

감사합니다. 지금은 이해! – yoooshi

+0

이전의 57,160 명에 어떻게 왔습니까? – honzajde

+1

그가 가지고있는 번호는 0xDF48이며 10 진수로 변환하면 57160입니다 : https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=0xdf48+in+decimal – cftarnas

1

좋아, 나는 가치를 말해주는 작은 자바를 썼다. 이 작동합니다. 어리석은 hbase 껍질.

import java.io.IOException; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.client.Get; 
import org.apache.hadoop.hbase.client.HTable; 
import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.util.Bytes; 


public class HBaseGet { 

public static void main(String[] args) throws IOException { 

    if(args.length < 4) { 
     throw new IOException("Parameters: table rowid columnFamily qualifier"); 
    } 

    assert args.length >= 4; 

    String tablename = args[0]; 
    byte[] rowid = Bytes.toBytes(args[1]); 
    byte[] family = Bytes.toBytes(args[2]); 
    byte[] qualifier = Bytes.toBytes(args[3]); 

    Configuration config = HBaseConfiguration.create(); 
    HTable table = new HTable(config, tablename); 

    Get get = new Get(rowid); 
    Result result = table.get(get); 

    if (result != null) { 
     byte[] value = result.getValue(family, qualifier); 
     String valueStr = Bytes.toString(value); 

     // convert bytes to long 
     long valueLong = 0L; 
     for (int i = 0; i < value.length; i++) 
     { 
      valueLong = (valueLong << 8) + (value[i] & 0xff); 
     } 

     System.out.println("================"); 
     System.out.println("String: "+valueStr); 
     System.out.println("Long: "+valueLong); 
     System.out.println("================"); 
    } 

} 

} 
+0

나는 그것이 정말로 내 질문에 답하기 때문에 cftarnas의 대답을 좋아한다. 이 스크립트를 코딩하는 것은 훌륭한 해결책이 아닙니다. – yoooshi

+0

의미가 있습니다. 실제 문제에 대한 답변입니다. –

0

잘못된 값이 삽입되지 않도록 삽입하기 바로 전에 MR 작업 인쇄를 시도하십시오.

또한 jruby 셸에서 문제가되지 않도록 Java 파일을 사용하여 값을 읽으십시오. 당신의 긴의