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



我使用的是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

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

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

值得注意的是,BigDecimal不是一个基元数据类型,而是一个包含两个组件的类:

任意精度整数未缩放值和32位整数缩放。

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

int比较类似。负int的符号位为1,而正int的符号位数为0。因此CCD_ 19将把负数视为大于正数。

最新更新