Hive from_unixtime毫秒

时间:2015-01-14 12:26:06

标签: hive unix-timestamp epoch milliseconds

我们在Hive中存储了一个时间戳纪元列(BIGINT)。 我们希望在这个时代获得Date'yyyy-MM-dd'。 问题是我的纪元是以毫秒为单位,例如1409535303522。 因此,选择时间戳,from_unixtime(timestamp,'yyyy-MM-dd')会给出错误的日期结果,因为它会以秒为单位预期纪元。

所以我尝试将它除以1000.但是它会转换为Double,我们无法对其应用函数。当我尝试将此双精度转换为Bigint时,甚至CAST也无效。

4 个答案:

答案 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