Hive unix_timestamp 函数计算不匹配

Posted

技术标签:

【中文标题】Hive unix_timestamp 函数计算不匹配【英文标题】:Hive unix_timestamp function calculation mismatch 【发布时间】:2015-09-11 06:58:04 【问题描述】:

我正在尝试编写一个 Hive 查询,它将为时间戳值添加 6 小时,然后将其与其他时间戳进行比较。

我使用的方法是使用unix_timestamp()函数转换时间戳,然后将其添加21600秒,使最终值比初始值提前6小时。

hive> select unix_timestamp('2014-11-02 00:58:20') from unix_tmp limit 1;
OK
1414907900

1414907900 + 6*60*60 = 1414929500

hive> select from_unixtime(1414929500) from unix_tmp limit 1;
OK
2014-11-02 05:58:20

我认为小时值应该是06 而不是05。我究竟做错了什么?

此外,另一个观察结果是,并非所有值都如此;对于某些值,上述计算给出了正确的结果。

有没有更好的方法来做小时加法和时间戳比较?

【问题讨论】:

基本上是格林威治标准时间的问题..相对于 GTM 的时间为 +1 或更多的时区 【参考方案1】:

正如docs 所说:

unix_timestamp(string date)

使用默认时区和默认语言环境将格式为 yyyy-MM-dd HH:mm:ss 的时间字符串转换为 Unix 时间戳(以秒为单位),如果失败则返回 0:

from_unixtime(bigint unixtime[, string format])

将 unix 纪元 (1970-01-01 00:00:00 UTC) 的秒数转换为表示 当前系统时区 中那个时刻的时间戳的字符串,格式为“1970-01-01 00:00:00”。


解决方案

from_utc_timestamp(timestamp, string timezone)

假设给定的时间戳是 UTC 并转换为给定的时区(从 Hive 0.8.0 开始)。例如,from_utc_timestamp('1970-01-01 08:00:00','PST') 返回 1970-01-01 00:00:00。

to_utc_timestamp(timestamp, string timezone)

假设给定的时间戳在给定的时区并转换为 UTC(从 Hive 0.8.0 开始)。例如,to_utc_timestamp('1970-01-01 00:00:00','PST') 返回 1970-01-01 08:00:00。

【讨论】:

谢谢你的回答,但我想检查 TimeStamp1 > (TimeStamp2 + 6hrs) 我该怎么做 如果要比较time_stamp,只需使用unix_timestamp()函数将两个time_stamp转换为unix_timestamp即可。 您没有在时间戳中添加小时。将小时添加到 unix_timestamp 这是 bigint。 这就是我首先尝试的;它没有解决:-( 比较unix_timestamp 结果很好。您的问题是将unix_timestamp 结果转换回time_stamp string。您可以使用to_utc_timestamp 在同一基础上制作time_stamp。

以上是关于Hive unix_timestamp 函数计算不匹配的主要内容,如果未能解决你的问题,请参考以下文章

hive 时间戳函数之unix_timestamp,from_unixtime

大数据之Hive:Hive日期处理函数之unix_timestamp

Hive 的 unix_timestamp 和 from_unixtime 函数

计算 Hive 中不包括星期日的天数

Hive内置函数之时间函数

如何使用 unix_timestamp 和 from_unixtime Hive 函数将数据类型更改为时间戳