2017-01-04 15 views
0

Я использую Hbase Помещенный API, чтобы написать длинный тип данных для Hbase используя код нижеHBase Java API, чтобы писать долго вместо шестнадцатеричных значений

p.add(Bytes.toBytes(this.hcol_fam_n), Bytes.toBytes(this.hcol_qual_n), Bytes.toBytes(this.newoffset)); 

При запуске команды сканирования на Hbase оболочки, значения отображается в шестнадцатеричном формате двоичного представления

value=\x00\x00\x00\x00\x00\x00\x00\x07 

Но когда я использую положить заявление от Hbase оболочки, он показывает правильно, как «7». Почему это различие? И есть ли способ записать значение как есть без использования Bytes.toBytes для записи в Hbase, чтобы я мог правильно видеть значение из оболочки Hbase?

Если нет другого способа записать значение в читаемой форме в оболочке hbase, как вызвать java Bytes.toString здесь для этого столбца в инструкции сканирования?

И когда я читаю то же значение, используя Hbase GET API, я не могу преобразовать значение из байтов в строку, используя Bytes.toString(value)

Это дает мне пустую строку. Но такое же значение преобразуется в Long с использованием Bytes.toLong(value)

Может кто-то, пожалуйста, помогите мне понять, почему это не конвертируется в строку, а в Long?

+1

«Но когда я использую оператор put из оболочки Hbase, говоря это, что вы думаете? –

ответ

1

HBase сохраняет все значения в виде массивов байтов и не сохраняет метаданные о том, что является типом данных, поэтому, когда вы помещаете значение типа Long, оно преобразует значение в его представление байтов и записывает байты в клетка.

Когда вы выполняете сканирование в оболочке, он пытается показать вам свои данные, но не знает, какой тип данных у вас есть. Таким образом, он отображает байты как символы, но если байт является символом управления, он показывает шестнадцатеричное представление вместо отображения мусора в консоли. И когда вы получаете данные с Bytes.toString, снова он не знает, какие данные находятся внутри ячейки, и только делает new String(bytes).

У вас есть два варианта:

  • преобразовать данные в строку, прежде чем положить в HBase: p.add(colFamily, qualifier, Bytes.toBytes(Long.toString(this.newoffset))); и при чтении его преобразовать обратно из строки в Лонг. Это добавляет некоторые накладные расходы для каждого чтения/записи и потребляет больше места, но вы будете иметь все ваши данные, читаемые человеком в оболочке.
  • поместите свое Длинное значение прямо так, как сейчас, и прочитайте его с помощью Bytes.toLong. Таким образом, ваши данные обычно потребляют меньше места (всегда 8 байтов на одно значение вместо 20) и быстрее читают и записывают, но вы все равно увидите шестнадцатеричное представление в оболочке HBase.
0

Лучший способ способ справиться с этим, это преобразовать целое число в строку перед сохранением его hbase.I была та же проблема решена, и это в Скале, как указано ниже: новую строку (data.toString) .getBytes()