HBase的Bytes.toBytes - 是它的输出序数吗?

时间:2016-03-27 15:16:55

标签: java hadoop hbase decimal ieee-754

我正在使用org.apache.hadoop.hbase.util.Bytes.toBytes(T)。我将此函数的输出存储在HBase中的值中,然后我想在其上使用比较操作(CompareOp.GREATERCompareOp.LESS ...)。

Bytes.toBytes(T)的输出是否保持"可比性"对于这些类型?含义,例如double

double d1 = ..., d2 = ...;
Bytes.compare(Bytes.toBytes(d1), Bytes.toBytes(d2)) == Double.compare(d1, d2)

这适用于这些类型吗?

  1. float / double
  2. int / long
  3. String
  4. BigDecimal

1 个答案:

答案 0 :(得分:2)

如果在比较之前转换回Java数据类型,那么是。 HBase存储二进制数据。如果将此二进制文件转换为Java数据类型,则输出值将与输入值相同,compare函数将比较解码为适当数据类型的值。

如果使用Bytes.compare,则不一定适用,因为这些值是根据二进制顺序进行比较的,而不是基于其解码值。

值得注意的是,BigDecimal不是原始数据类型,而是具有两个组件的类:

  

任意精度整数非标度值和32位整数标度。

根据确切的二进制编码,Bytes.compare结果可能不匹配BigDecimal.compare,因为Bytes函数比较原始二进制数据,而BigDecimal比较解码值。

同样适用于int比较。 Negative int的符号位为1,而positive int的符号位为0。因此Bytes.compare会将负数视为大于正数。