我正在使用带有浮点数据类型(由Mistake)的hive外部表来存储Unix纪元时间戳。
当我在hive外部表上发出where子句时,它会返回一些奇怪的结果。举个例子。
select event_time from tbl_name where event_time=1478649561 limit 10
输出:
1478649600
任何人都可以帮我理解这个错误吗?
答案 0 :(得分:1)
这不是一个Hive问题,因为它是浮点精度的一般问题。您将看到1478649561(一个整数类型)的效果在浮点表示中近似,以适应32位Java浮点类型。
为了在Hive的上下文之外以更简单的形式看到这一点,这里有一个示例Scala REPL会话,它将1478649561转换为Java Float
并打印结果。
scala> printf("%f", new java.lang.Float(1478649561))
1478649600.000000
如您所见,这近似为1478649600.如果数据存储为32位浮点数,则无法避免这种情况。
我强烈建议将数据存储为整数类型或DATE
类型以避免此问题。 Hive Data Types上的Apache Hive文档详细讨论了不同的数据类型。如果您有兴趣深入了解浮点精度的全部细节,那么Wikipedia Floating point文章就是一个不错的起点。