我正在使用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
答案 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
会将负数视为大于正数。