我正在查看Apache Flink源代码并阅读flink-core
模块。我不明白为什么DoubleValue
和FloatValue
没有实现NormalizableKey
接口,IntValue
会这样做。
答案 0 :(得分:4)
NormalizableKey
接口定义了生成固定长度二进制前缀密钥的方法,即字节序列。前缀键的目的是直接比较原始字节的值,而无需昂贵的对象反序列化。
这样的固定长度前缀密钥很容易获得整数值,例如Integer
,Long
和Short
。但是,浮点值(Float
,Double
)的二进制表示与整数值不同,由三部分组成:指数,分数和符号位。由于这种表示,浮点值可以覆盖巨大的值范围(以精度为代价)。可以在不反序列化的情况下进行比较的浮点值的二进制表示不像整数值那样容易定义。此外,规范化密钥的最常见用例是分组或加入。由于这些操作需要对象相等,因此浮点值不常见。
这就是FloatValue
和DoubleValue
未实现NormalizableKey
接口的原因。规范化的密钥有利于对浮点值的数据进行排序。