Hive from_unixtime 毫秒

Hive from_unixtime for milliseconds

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

所以我尝试将它除以 1000。但随后它被转换为 Double,我们无法对其应用函数。当我尝试将此双精度转换为 Bigint 时,甚至 CAST 也不起作用。

通过以下查询解决了问题:

select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10;

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;

在原始答案中你会得到字符串,但如果你想得到日期你需要用日期调用额外的转换:

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)
If the string is in the form 'YYYY-MM-DD', then a date value corresponding to that year/month/day is returned. If the string value does not match this formate, then NULL is returned.

日期类型仅可从 Hive > 0.12.0 如前所述 here:

DATE (Note: Only available starting with Hive 0.12.0)

类型应为double以确保精度不丢失:

select from_unixtime(cast(1601256179170 as double)/1000.0, "yyyy-MM-dd hh:mm:ss.SSS") as event_timestamp