Hive 和 Impala 之间的时间戳

Posted

技术标签:

【中文标题】Hive 和 Impala 之间的时间戳【英文标题】:time stamp between Hive and Impala 【发布时间】:2018-02-23 14:44:26 【问题描述】:

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

知道这是你们可以克服的问题,还是 Cloudera 的一个大问题?

请告诉我。

【问题讨论】:

请详细说明您的问题。这些信息不足以调试您的问题。很可能是时区问题,但有关该问题的更多详细信息将有助于准确纠正它。 @Eresh 请检查我的答案,如果有帮助,请点赞/接受。 我想更正上面的内容。 “Impala 将在时间戳上增加 5 小时,它将被视为 impala 的本地时间。”这是不正确的。 Impala 对它读取的时间戳没有任何作用。问题是 HIVE 总是希望根据机器的本地 TZ 将 TS 转换为 UTC。改变价值的是它的 HIVE,而不是 Impala。 Impala 也不会“假定 UTC”只是简单地读取写入的值。例如,如果您编写时间为 08-24-2018 11:16:00 的 TS,则 HIVE 假定本地时区基于机器,然后将其转换为 UTC 并写入。 Impala 只写 ( 【参考方案1】:

根据impala 文档here,默认情况下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默认关闭以避免性能开销,但实际情况是在 处理 Hive 编写的 Parquet 文件中的 TIMESTAMP 列,以 避免意外行为。

【讨论】:

【参考方案2】:

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

Impala 将在时间戳上增加 5 小时,它将被视为 impala 的本地时间。最简单的解决方案是将字段类型更改为字符串或在您插入配置单元时减去 5 小时。

这已经有很多questions了,看看吧。

【讨论】:

以上是关于Hive 和 Impala 之间的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

在 hive/impala sql 中按日期获取数据,

比较 HDFS 中的毫秒时间戳

将具有 AM/PM 的字符串列转换为 Impala 中的时间戳

如何在 hive 中将时间戳转换为 gmt 格式

Impala 无法从 Parquet 文件中读取无日期时间戳

在 Hive 或 Impala 中从 int 转换为时间戳