[英]HBase java API to write long instead of Hexadecimal values
我正在使用Hbase Put API使用以下代码将长数据类型写入Hbase
p.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中以可读形式写入值,那么如何在scan语句中为此列调用java Bytes.toString
?
当我使用Hbase GET API读取相同的值时,无法使用Bytes.toString(value)
将值从Bytes转换为字符串
这给了我空字符串。 但是使用Bytes.toLong(value)
将相同的值转换为Long。
有人可以帮我理解为什么这不是转换为字符串而是转换为Long吗?
HBase将所有值存储为字节数组,并且不存储有关数据类型的任何元数据,因此,当您输入Long
类型的值时,HBase会将值转换为其字节表示形式,并将字节写入单元格中。
当您在外壳中执行“扫描”时,它会尽力向您显示数据,但它不知道数据的类型。 因此它将字节显示为字符,但是如果字节是控制字符,它将显示为十六进制表示,而不是在控制台中显示垃圾。 而且,当您使用Bytes.toString
获取数据时,它也不知道单元格内包含哪种数据,而仅生成new String(bytes)
。
您有两种选择:
p.add(colFamily, qualifier, Bytes.toBytes(Long.toString(this.newoffset)));
并在读取时从String转换回Long。 这会增加每次读/写的开销,并占用更多空间,但是您将所有数据都可读在外壳中。 处理此问题的最佳方法是将整数转换为字符串,然后再将其存储到hbase。我遇到了相同的问题,并按如下所示解决了这个问题:new String(data.toString).getBytes()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.