【问题标题】:hive date cast issue蜂巢日期转换问题
【发布时间】:2019-10-12 03:52:24
【问题描述】:

嗨,在我的 Hive 表中,我有一列包含这样的日期值。

cl1
31102019000000
30112019000000
31122019000000

我尝试将列值转换为这样的日期格式

Select from_unixtime(unix_timestamp(cl1,'yyyy/MM/dd'),'yyyy-MM-dd') from table1;

它打印 NULL。任何帮助将不胜感激。

【问题讨论】:

  • 是字符串吗?数字?日期是 2019 年 10 月 31 日等吗? Unix 时间戳是自 1970 年 1 月 1 日午夜以来的秒数,它们看起来根本不像日期 - 将这些数字视为 unix 时间戳会在 2955 年 8 月 2 日左右看到它们
  • 存储为字符串

标签: sql hadoop hive bigdata hiveql


【解决方案1】:

您说您在 dd-mm-yyyy 中有日期,但随后发布的数据根本没有任何连字符

假设 31102019000000 是 31-oct-2019 00:00:00

Select from_unixtime(unix_timestamp(cl1,'ddMMyyyyHHmmss'),'yyyy-MM-dd') from ...

将格式字符串与数据匹配..

【讨论】:

    【解决方案2】:

    试试这个

    Select from_unixtime(unix_timestamp(REGEXP_REPLACE(cl1,'0+$',''),'ddMMyyyy'),'yyyy-MM-dd') from table1;
    

    但这会在 2020,2010 年失败。 所以下面的查询会是一个更好的选择

    Select from_unixtime(unix_timestamp(cast(cast(cl1/1000000 as bigint) as string),'ddMMyyyy'),'yyyy-MM-dd') from table1;
    

    【讨论】:

      【解决方案3】:

      您尝试转换为日期格式的 UnixTimeStamp 超出范围。 您的时间戳对应于:

      GMT: Saturday, August 2, 2955 1:43:20 AM
      Your time zone: Saturday, August 2, 2955 5:43:20 AM GMT+04:00
      Relative: In 936 years
      

      这是 MYSql 社区中的一个开放错误。请检查以下 URL 以供参考。 https://forums.mysql.com/read.php?20,385047,385132#msg-385132

      MySQL 数据库的内置函数如 UNIX_TIMESTAMP() 将在 2038 年 1 月 19 日 03:14:07 UTC 之后返回 0。(来源:https://en.wikipedia.org/wiki/Year_2038_problem

      【讨论】:

      • 这个查询是关于 Hive 而不是 MySQL。 @Pinaki 已经回答了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多