La notación de la shell de hbase es bastante poco amigable, por un lado porque la forma de escribir las sentencias es poco intuitiva, al principio, y por otro lado porque los valores son simpre arrays de bytes. Por tanto la salida de un comando suele leerse mal, sobre todo si lo que se ha almacenado no son los bytes de un string
100316046_2017_2_1 column=23:1485991943_latitud, timestamp=1486109715526, value=@Ea\x04;nS\x85 100316046_2017_2_1 column=23:1485991943_longitud, timestamp=1486109715526, value=\xC0\x009\xF7\x87\xE6/\xDE
Pero un get de hbase como el aterior se puede formatear sabiendo el tipo de dato que se almacena en el qualifier. Por ejemplo en el caso anterior \xC0\x009\xF7\x87\xE6/\xDE corresponde con la representación de los bytes de un double en un string. Para poder ver la representación correcta de este byte[] se puede aplicar el siguiente formato a la salida del scan
get 'map', 'row-key', 'family:qualifier:c(Java::OrgApacheHadoopHbaseUtil::Bytes).toDouble'
Y obtendremos como resultado
hbase(main):013:0> get 'map', 'row-key', 'family:qualifier:c(Java::OrgApacheHadoopHbaseUtil::Bytes).toDouble' COLUMN CELL family:qualifier timestamp=1486109715526, value=43.281710106997
(Java::OrgApacheHadoopHbaseUtil::Bytes).toDouble corresponde al siguiente código java ejecutado desde ruby
org.apache.hadoop.hbase.util.Bytes().toDuble(byte[] columnValue)
Lo que quiere decir que podremos aplicar para dar formato a nuestro comando de hbase shell cualquier método estático de java que tenga como parámetro un byte[]
Un ejemplo que he encontrado mucho más interesante que lo que acabo de explicar es el siguiente, en el que en una columna de hbase se ha guardado un byte[] de avro y luego se recupera y se muestra como un JSON