根据文档 Hives 标准函数 hour() 应该返回一个 0 到 24 之间的值,但由于某种原因,我总是得到一个 12 小时制的时钟值,介于 0 到 12 之间。我在我的 Hive 表中使用一个MySQLDateTime
字段作为字段。Timestamp
有谁知道可能是什么问题?
5 回答
我想我找到了。我查看了源代码,显然UDFHour.java
确实有两个evaluate()
功能。一种接受Text
对象作为参数,另一种接受TimeStampWritable
对象作为参数。两者都使用一个Calendar
实例,但由于某种原因,第一个函数返回的值Calendar.HOUR_OF_DAY
和第二个Calendar.HOUR
。
我查看了 Hives 文档,但找不到关于第二个函数的任何信息,但它就在那里。我正在使用 Hortonworks 的 HDP 附带的 Hive 0.9.0.16。
编辑: 我已经报告了一段时间。现在有一个补丁可用:https ://issues.apache.org/jira/browse/HIVE-3850 。
不管做了什么hive
,您都可以将要返回的日期格式化为 24 小时格式。
select FROM_UNIXTIME(mydate)
from mytable
;
或者,如果有意义,您可以更新所有日期时间戳。
如果函数hour()
使用字符串格式,则返回 24 小时格式的结果。您可以使用
hour(cast (column_name as string))
对于较低版本的配置单元,我有一个解决方法
hour(from_unixtime(
unix_timestamp(
from_utc_timestamp(
from_unixtime(round(created_at/1000)),'Etc/GMT-8')
)))
由于我使用的是 EMR,我不能选择使用最新版本的 hive,所以我得到了这个解决方法。
只是为了展示上面已经讲过的例子
HOUR(cast (from_utc_timestamp(my_date_timestamp,'GMT') as string)) -- 返回 24 小时制
HOUR( from_utc_timestamp(my_date_timestamp ,'GMT') ) --返回 12 小时格式