【问题标题】:Java(HBase) API: How to know the data type of a value stored in bytesJava(HBase)API:如何知道以字节存储的值的数据类型
【发布时间】:2012-01-12 11:32:35
【问题描述】:

在使用 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 问题,但我用谷歌搜索并找不到解决方法。有可能知道吗?

在另一个方向,从 HBase Java API,我如何知道存储在 family:qualifier 中的给定值的数据类型?

谢谢!

【问题讨论】:

    标签: java hbase


    【解决方案1】:

    与传统的 RDBMS 不同,HBase 不支持“类型化列”,其中数据存储会跟踪所存储数据的类型。 HBase 本身并不跟踪 - 因此无法原生地告诉 - 存储在列中的数据类型。使用 HBase 的开发人员负责自行跟踪列数据类型。

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

    HBase 文档的“体系结构”页面在这里更详细地解释了 HBase 和传统 RDBMS 之间的区别:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • +1:缺点是一些 32 位的 int 值也是有效的字符串。
      【解决方案3】:

      在存储值时使用 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中的一个例子

      【讨论】:

      • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
      • 在答案中添加这个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多