2012-05-14 3 views
1

У меня есть таблица hbase с именем «mytable» только с одним семейством столбцов «по умолчанию» и только одна спецификация «details».Hbase shell: значение вырезано

Теперь я сделать этот запрос:

get 'mytable', 'test' 

и значение результата режется. Это должно быть число (длинное):

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

Почему я вижу только первые семь байтов? Как я могу увидеть полную стоимость?

Если я прошу что-то с небольшим значением, оно работает. Но большие значения являются неполными.

+0

Как вы вставляете значения? –

+0

Значения вставляются с помощью задания Сократить работу, написанное на Java. – yoooshi

+0

Можете ли вы попытаться сделать задание MR напечатать значение непосредственно перед вставкой, просто чтобы убедиться, что неправильные значения не вставлены. Кроме того, попробуйте прочитать значения с помощью java-файла, чтобы убедиться, что это не проблема с оболочкой jruby. –

ответ

4

Все 8 байт вашей долго в этой строке:

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

Легче увидеть этот путь:

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

Первые 6 байт 0 (шест \ x00), следующий 223 (hex \ xDF), а последнее - ASCII H (\ x48), это делает ваш длинный десятичный 57,160. Значения HBase - это только массивы символов, а не тип, так что оболочка избегает как шестнадцатеричные все байты, которые не подлежат печати ASCII, и оставляет одни те, которые не всегда самые ясные.

+0

Спасибо! Теперь я понимаю! – yoooshi

+0

Как вы пришли к 57,160 от предыдущего? – honzajde

+1

Число, которое у него есть, равно 0xDF48, которое при переводе в десятичное число равно 57160: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=0xdf48+in+decimal – cftarnas

1

Хорошо, я написал небольшую Java, которая подсказывает мне значение. Это работает. Глупый hbase shell.

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 напечатать значение непосредственно перед вставкой, просто чтобы убедиться, что неправильные значения не вставлены.

Также попробуйте прочитать значения с помощью java-файла, чтобы убедиться, что это не проблема с оболочкой jruby.