Hive和 Impala 之间的时间戳

v9tzhpje  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(632)

我有一个场景,我们在源文件中有一个timestamp字段,并以文本格式和parquet格式加载到归档文件和托管表中。我们看到的区别是这两个表之间的值相差了5个小时。
你知道这是你们拐杖碰到的还是cloudera的大麻烦吗?
请告诉我。

ars1skjm

ars1skjm1#

当您在配置单元中使用时间戳时,必须设置 convert_legacy_hive_parquet_utc_timestamps 全球地。
Impala 将增加5个小时的时间戳,它将视为当地时间为 Impala 。最简单的解决方案是将字段类型更改为string或在您插入配置单元时减去5小时。
这方面已经有很多问题了,看看吧。

unguejic

unguejic2#

根据 impala 文档在这里, impala 默认情况下,数据采用utc时区。
因为 Impala 并不认为 TIMESTAMP 如果值位于任何特定时区,则必须了解查询、插入或转换的数据的时区方面。
为了与unix系统调用保持一致 TIMESTAMPnow() 函数表示系统时区中的本地时间,而不是utc。要以可移植的方式存储相对于当前时间的值,请转换 now() 使用 to_utc_timestamp() 功能优先。
在使用hive时,您可能希望遵循文档中的建议,但请注意,解决方案会带来性能开销。为避免性能开销,建议您将配置单元日期保存为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 默认情况下关闭,以避免性能开销,在实际情况下,在处理时将其打开 TIMESTAMP 配置单元编写的Parquet文件中的列,以避免意外行为。

相关问题