的Java(HBase的)API:如何知道存储字节

问题描述:

与HBase的Java API的工作,当值的数据类型,我有如下一行代码:的Java(HBase的)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中,我怎么知道存储在family:qualifier中的给定值的数据类型?

谢谢!

对于你的第一个问题,你可以尝试转换为int,如果你有一个异常,你知道它是一个字符串。但这不是一个好方法。

+4

1一个例子:该一面是,某些32位'int'值也是有效的字符串。 – 2012-01-12 11:52:17

与传统的RDBMS不同,HBase不支持“类型列”,数据存储区会跟踪所存储数据的类型。 HBase本身并没有跟踪 - 所以没有办法本地告诉 - 存储在列中的数据的类型。使用HBase的开发人员负责自行跟踪列数据类型。

对于许多应用程序,应用程序可以对每列的类型进行“硬编码”。通过这种方式,HBase表往往比RDBMS表更适用于特定应用程序。开发人员还可以创建专用于行的数据类型模式的列族或列(例如,将Avro模式序列化为字符串)。

HBase的文档的“建筑”的网页介绍HBase的和传统的RDBMS略偏这里之间的区别:

https://hbase.apache.org/book/architecture.html#arch.overview.when

使用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 

注:值43,45和52,同时将数据写入到HBase的按数据类型被追加。

参见在http://davidgreenshtein.blogspot.co.uk/2015/03/geo-spatial-search-in-hbase.html

+1

在解答当前问题时添加一些解释以及回答如何解答此问题的答案 – 2016-12-26 18:49:02

+0

在答案中加入此答案。 – 2016-12-26 19:42:46