HBase java API写入long而不是Hexadecimal值

时间:2017-01-04 04:07:34

标签: java shell hbase

我正在使用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中以可读形式编写值,那么如何在扫描语句中为此列调用java Bytes.toString

当我使用Hbase GET API读取相同的值时,我无法使用Bytes.toString(value)

将值从字节转换为字符串

这给了我空字符串。但是使用Bytes.toLong(value)

将相同的值转换为Long

有人可以帮助我理解为什么这不是转换为字符串而是转换为Long?

1 个答案:

答案 0 :(得分:1)

HBase将所有值存储为字节数组,并且不存储有关数据类型的任何元数据,因此当您输入类型为header("Content-type: image/png"); echo base64_decode($my_image); 的值时,它会将值转换为数据类型' s字节表示并将字节写入单元格。

当您在外壳中执行扫描时,它会尝试向您显示您的数据,但它不知道您的数据的类型。因此它将字节显示为字符,但如果字节是控制字符,则显示它的十六进制表示,而不是在控制台中显示垃圾。当您使用Long获取数据时,它又不知道单元格中的数据类型只是Bytes.toString

您有两种选择:

  • 在放入HBase之前将数据转换为String: new String(bytes)并在读取时将其从String转换回Long。这会增加每次读/写的开销,并占用更多空间,但您可以在shell中使用人类可读的所有数据。
  • 直接使用您的Long值,并使用Bytes.toLong将其读回。这样,您的数据通常占用的空间更少(每个值总是8个字节,而不是最多20个),读取和写入速度更快,但您仍然可以在HBase shell中看到它的十六进制表示。