我正在使用Hbase Put API使用以下代码
将长数据类型写入Hbasep.add(Bytes.toBytes(this.hcol_fam_n), Bytes.toBytes(this.hcol_qual_n), Bytes.toBytes(this.newoffset));
当我在Hbase shell上运行扫描命令时,值以二进制表示的十六进制格式显示
value=\x00\x00\x00\x00\x00\x00\x00\x07
但是当我使用来自Hbase shell的put语句时,它会正确显示为“7”。为什么会有这种差异?有没有办法按原样写入值而不使用Bytes.toBytes写入Hbase,以便我可以从Hbase shell中正确地看到值?
如果没有其他方法可以在hbase shell中以可读形式编写值,那么如何在扫描语句中为此列调用java Bytes.toString
?
当我使用Hbase GET API读取相同的值时,我无法使用Bytes.toString(value)
这给了我空字符串。但是使用Bytes.toLong(value)
有人可以帮助我理解为什么这不是转换为字符串而是转换为Long?
答案 0 :(得分:1)
HBase将所有值存储为字节数组,并且不存储有关数据类型的任何元数据,因此当您输入类型为header("Content-type: image/png");
echo base64_decode($my_image);
的值时,它会将值转换为数据类型' s字节表示并将字节写入单元格。
当您在外壳中执行扫描时,它会尝试向您显示您的数据,但它不知道您的数据的类型。因此它将字节显示为字符,但如果字节是控制字符,则显示它的十六进制表示,而不是在控制台中显示垃圾。当您使用Long
获取数据时,它又不知道单元格中的数据类型只是Bytes.toString
。
您有两种选择:
new String(bytes)
并在读取时将其从String转换回Long。这会增加每次读/写的开销,并占用更多空间,但您可以在shell中使用人类可读的所有数据。