我使用的是org.apache.hadoop.hbase.util.Bytes.toBytes(T)
。我将这个函数的输出存储在HBase中的一个值中,然后我想对它使用比较运算(CompareOp.GREATER
、CompareOp.LESS
…)
Bytes.toBytes(T)
的输出是否保持这些类型的"可比性"?含义,例如double
:
double d1 = ..., d2 = ...;
Bytes.compare(Bytes.toBytes(d1), Bytes.toBytes(d2)) == Double.compare(d1, d2)
这适用于这些类型吗?
float
/double
int
/long
String
BigDecimal
如果在比较之前转换回Java数据类型,则为yes。HBase存储二进制数据。如果将此二进制转换为Java数据类型,则输出值将与输入值相同,并且compare
函数将比较解码为适当数据类型的值。
如果使用Bytes.compare
,则这不一定成立,因为这些值是基于二进制顺序进行比较的,而不是基于解码值。
值得注意的是,BigDecimal不是一个基元数据类型,而是一个包含两个组件的类:
任意精度整数未缩放值和32位整数缩放。
根据精确的二进制编码,Bytes.compare
结果可能与BigDecimal.compare
不匹配,因为Bytes函数比较原始二进制数据,而BigDecimal比较解码值。
与int
比较类似。负int的符号位为1
,而正int的符号位数为0
。因此CCD_ 19将把负数视为大于正数。