的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,如果你有一个异常,你知道它是一个字符串。但这不是一个好方法。
与传统的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
在解答当前问题时添加一些解释以及回答如何解答此问题的答案 – 2016-12-26 18:49:02
在答案中加入此答案。 – 2016-12-26 19:42:46
1一个例子:该一面是,某些32位'int'值也是有效的字符串。 – 2012-01-12 11:52:17