Formateando el valor de una columna al realizar un hbase get
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=@Eax04;nSx85 100316046_2017_2_1 column=23:1485991943_longitud, timestamp=1486109715526, value=xC0x009xF7x87xE6/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 xC0x009xF7x87xE6/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