使用HBase Java API时,我有一行代码如下:
byte[] value = scanner.next().getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier));
假设我不知道这个值是Int还是String类型,应该在Byte.toInt(value)
和Byte.toString(value)
之间使用哪个来正确打印值?
这不是一个真正的HBase / Hadoop问题,而是一个Java问题,但我用Google搜索并找不到获取它的方法。有可能知道吗?
另一方面,从HBase Java API,我如何知道存在于系列中的给定值的数据类型:限定符?
谢谢!
答案 0 :(得分:6)
与传统的RDBMS不同,HBase不支持“类型列”,其中数据存储跟踪存储的数据类型。 HBase本身并没有跟踪 - 因此无法本地告知 - 存储在列中的数据类型。使用HBase的开发人员负责自己跟踪列数据类型。
对于许多应用程序,应用程序可以“硬编码”每列的类型。通过这种方式,HBase表往往比RDBMS表更具应用程序特性。开发人员还可以创建专用于该行的数据类型架构的列族或列(例如,序列化为字符串的Avro架构)。
HBase文档的“架构”页面在这里解释了HBase与传统RDBMS之间的区别:
https://hbase.apache.org/book/architecture.html#arch.overview.when
答案 1 :(得分:3)
对于你的第一个问题,你可以尝试转换为int,如果你有异常,你知道它是一个字符串。但这不是一个好方法。
答案 2 :(得分:0)
存储值时使用OrderedBytes。这确保了每种类型的数据都带有一些数字值。 请参阅https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/OrderedBytes.html
byte[] value = scanner.next().getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier));
int typeByte = value[0]
if(typeByte == 52)
// do operation for String
else if(typeByte == 43)
// do operation for Integer
else if (typeByte == 45)
// do operation for Double
注意:根据数据类型将数据写入hbase时附加值43,45和52。
参考http://davidgreenshtein.blogspot.co.uk/2015/03/geo-spatial-search-in-hbase.html
中的一个示例