【问题标题】:HBase's Bytes.toBytes - is its output ordinal?HBase 的 Bytes.toBytes - 它的输出是序数吗?
【发布时间】:2016-03-27 15:16:54
【问题描述】:

我正在使用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 hadoop hbase decimal ieee-754


【解决方案1】:

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

如果您使用Bytes.compare,那么这不一定成立,因为这些值是根据它们的二进制顺序进行比较的,而不是根据它们的解码值。

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

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

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

int 比较也是如此。负 int 的符号位为 1,而正 int 的符号位为 0。因此Bytes.compare 会将负数视为大于正数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2016-12-08
    • 1970-01-01
    • 2011-07-03
    • 2015-06-12
    相关资源
    最近更新 更多