我们在Hive中存储了一个时间戳纪元列(BIGINT)。 我们希望在这个时代获得Date'yyyy-MM-dd'。 问题是我的纪元是以毫秒为单位,例如1409535303522。 因此,选择时间戳,from_unixtime(timestamp,'yyyy-MM-dd')会给出错误的日期结果,因为它会以秒为单位预期纪元。
所以我尝试将它除以1000.但是它会转换为Double,我们无法对其应用函数。当我尝试将此双精度转换为Bigint时,甚至CAST也无效。
答案 0 :(得分:28)
通过以下查询解决:
select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10;
答案 1 :(得分:3)
在原始答案中你会得到字符串,但是如果你想得到约会,你需要在日期中调用额外的演员:
select
timestamp,
cast(from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') as date) as date_col
from Hadoop_V1_Main_text_archieved
limit 10;
Docs用于投射日期和时间戳。将字符串转换为日期:
cast(string as date)
如果字符串的格式为“YYYY-MM-DD”,则返回与该年/月/日相对应的日期值。如果字符串值与此格式不匹配,则返回NULL。
日期类型仅适用于Hive>提到的0.12.0
here:
DATE
(注意:仅从Hive 0.12.0开始提供)
答案 2 :(得分:2)
timestamp_ms 是以毫秒为单位的unixtime
SELECT from_unixtime(floor(CAST(timestamp_ms AS BIGINT)/ 1000),' yyyy-MM-dd HH:mm:ss.SSS')as created_timestamp FROM table_name;
答案 3 :(得分:1)
类型应为double
,以确保精度不会丢失:
select from_unixtime(cast(1601256179170 as double)/1000.0, "yyyy-MM-dd hh:mm:ss.SSS") as event_timestamp