具有unix时间戳的Hive float数据类型

时间:2017-01-23 21:56:21

标签: hadoop hive floating-point hiveql

我正在使用带有浮点数据类型(由Mistake)的hive外部表来存储Unix纪元时间戳。

当我在hive外部表上发出where子句时,它会返回一些奇怪的结果。举个例子。

select event_time from tbl_name where event_time=1478649561 limit 10 

输出:

  

1478649600

任何人都可以帮我理解这个错误吗?

1 个答案:

答案 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文章就是一个不错的起点。