【问题标题】:Hive from_unixtime for milliseconds蜂巢 from_unixtime 毫秒
【发布时间】:2015-01-14 12:26:05
【问题描述】:

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

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

【问题讨论】:

  • 如果将格式更改为'yyyy-MM-dd HH:mm:ss.SSS'?

标签: hive unix-timestamp epoch milliseconds


【解决方案1】:

通过以下查询解决:

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

【讨论】:

  • 这不起作用..它给出一个错误 - 类 org.apache.hadoop.hive.ql.udf.UDFFromUnixTime 与(双精度,字符串)没有匹配方法。
【解决方案2】:

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

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

【讨论】:

    【解决方案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 开始可用)

    【讨论】:

      【解决方案4】:

      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;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多