繁体   English   中英

HBase Java API写长而不是十六进制值

[英]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)

您有两种选择:

  • 在放入HBase之前将数据转换为String: p.add(colFamily, qualifier, Bytes.toBytes(Long.toString(this.newoffset))); 并在读取时从String转换回Long。 这会增加每次读/写的开销,并占用更多空间,但是您将所有数据都可读在外壳中。
  • 直接像现在一样放置Long值,然后使用Bytes.toLong读回它。 这样,您的数据通常会占用较少的空间(每个值总是8个字节,而不是最多20个字节),并且读写速度更快,但是您仍会在HBase Shell中看到它的十六进制表示形式。

处理此问题的最佳方法是将整数转换为字符串,然后再将其存储到hbase。我遇到了相同的问题,并按如下所示解决了这个问题:new String(data.toString).getBytes()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM