Что такое не шестнадцатеричные символы в HBase Shell RowKey?

Я сохраняю свой ключ в виде байтового массива. В HBase Shell, когда я смотрю на свой ключ, я вижу не шестнадцатеричные значения... У меня нет включенной кодировки, у меня не включено никакое сжатие.

Вот пример... что такое VNQ? что такое BBW? Я предполагаю, что происходит какая-то кодировка?

\xFB\xC6\xE8\x03\xF0VNQ\x8By\xF6\x89D\xC1\xBBW\x00\x00\x00\x00\x00\x00\x01\xF3\x00\x00\x00\x00\x00\x07\xA1\x1F

1 ответ

Решение

Оболочка HBase использует нечто, называемое представлением байтовых массивов (двоичная строка) (Escaped hexadecimal) для вывода ключей / значений (см. Метод Bytes.toStringBinary). Этот метод в основном делает одну из двух вещей для каждого байта:

  1. Преобразуйте его в печатное представление (ASCII), если значение байта находится в пределах диапазона.
  2. Преобразуйте его в \xHH (где "H" представляет шестнадцатеричную цифру), если значение байта не находится в диапазоне ASCII.

Идея состоит в том, чтобы использовать печатное представление. Если бы все ваши ключи / значения были печатными символами, то оболочка не распечатала бы ни одну из этих странных последовательностей \ xHH.

Если вы предпочитаете Hex-представление, попробуйте следующее в оболочке HBase:

> import org.apache.hadoop.hbase.util.Bytes
> Bytes.toHex(Bytes.toBytesBinary("\xFB\xC6\xE8\x03\xF0VNQ"))
> fbc6e803f0564e51

Вы можете изменить оболочки ruby ​​оболочки hbase, чтобы использовать метод toHex() вместо toStringBinary() для распечатки данных (или лучше; вы можете добавить патч в HBase, чтобы включить флаг для двух вариантов, если вам это нравится; см. Руководство разработчика HBase).

Другие вопросы по тегам