Hive和Impala之间的时间戳

时间:2018-02-23 14:44:26

标签: hadoop hive impala

我有一个场景,我们在源文件中有一个时间戳字段,并以文本格式加载到存档中,并以托盘格式加载到托管表中。 我们看到的差异是这两个表之间的值相差5小时。

任何想法,如果这是你们克服的东西,或者这对Cloudera来说是一个大问题吗?

请告诉我。

2 个答案:

答案 0 :(得分:0)

当您在配置单元中使用时间戳时,这是一种预期的行为,您必须全局设置convert_legacy_hive_parquet_utc_timestamps

Impala会在时间戳上添加5个小时,它将被视为黑手党的当地时间。最简单的解决方案是在插入配置单元时将字段类型更改为字符串或减去5小时。

已经有很多questions,请查看。

答案 1 :(得分:0)

根据impala文档hereimpala默认为数据的UTC时区。

  

因为Impala不认为TIMESTAMP值在任何值中   特定的时区,你必须意识到时区方面   您查询,插入或转换的数据。

     

为了与Unix系统调用保持一致,TIMESTAMP返回   now()函数表示系统时区的本地时间,   而不是UTC。在a中存储相对于当前时间的值   便携式方式,使用转换任何now()返回值   to_utc_timestamp()首先发挥作用。

使用配置单元时,您可能希望遵循文档建议的内容,但请注意解决方案存在性能开销。为避免性能开销,建议您以UTC时区(如果可能)保存配置单元日期

  

如果您有Hive编写的数据文件,那些TIMESTAMP值   表示写入数据的主机的本地时区,   Impala处理时可能导致结果不一致。   为避免兼容性问题或必须编写解决方法,您可以   指定这些impalad启动标志中的一个或两个:

     

-use_local_tz_for_unix_timestamp_conversions=true

     

-convert_legacy_hive_parquet_utc_timestamps=true

     

虽然默认情况下-convert_legacy_hive_parquet_utc_timestamps 已关闭,以避免性能开销,但在实际情况下将其打开时   处理由Hive编写的Parquet文件中的TIMESTAMP列   避免意外行为。