【问题标题】:Hive convert UTC string into datetimeHive 将 UTC 字符串转换为日期时间
【发布时间】:2014-11-18 07:51:03
【问题描述】:

我有一个这样的字符串:"2014-09-02T03:01:09.8093664Z",我正在尝试将其转换为本地时区。我试过from_utc_timestamp(eventTime, 'GMT')、from_utc_timestamp(eventTime, "PDT"),但 Hive 只是返回错误:

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row (tag=0) {"key":{"_col0":"2014-09-02T03:01:09.8093664Z",
.
.
.
    ... 7 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating Converting field _col0 from UTC to timezone: 'PDT'

我在这里做错了吗?

我搜索了stackoverflow并没有找到解决这个问题的方法(Local Time Convert To UTC Time In Hive相关但没有解决问题)

【问题讨论】:

  • 有人建议我从字符串中删除“T”,Hive 应该开始将其识别为日期时间。有没有其他方法可以将上述 UTC 转换为本地?

标签: hadoop hive bigdata hiveql


【解决方案1】:

您必须先以正确的格式提取时间和日期字符串,然后才能将其转换为 GMT。这需要以下格式“yyyy-MM-dd HH:mm:ss”。

使用 regexp_replace 提取字符串,然后将其通过管道传递给 from_utc_timestamp 函数,如下所示:

select from_utc_timestamp(regexp_replace(event_time,'(\^\\d{4}-\\d{2}-\\d{2})T(\\\d{2}:\\d{2}:\\d{2}).*','$1 $2),'GMT') from my table;

你的输出是:2014-09-01 03:01:09

祝你好运!

【讨论】:

    【解决方案2】:

    from_unixtime(UNIX_TIMESTAMP("2014-09-02T03:01:09Z", "yyyy-MM-dd'T'HH:mm:ss'Z'"),"yyyy-MM-dd HH:mm:ss ")

    转换为 2014-09-02 03:01:09

    【讨论】:

      【解决方案3】:

      解决此问题的一个有用方法是创建一个 UDF 函数来执行此操作。这个新的可能是针对这种情况的,也可能是更通用的,以适应更多的日期时间格式转换。您可以阅读以下一些好处:

      • 使您的配置单元查询更具可读性
      • 避免重复代码如果您在其他查询中需要此操作
      • 使您的系统更具可扩展性,因为您可以随时更新此方法
      • 将复杂的操作委托给 Java 代码,因此您将能够测试那些复杂的部分。

      您能否详细了解如何创建自定义 UDF here。

      如果您需要了解如何在 Java 中实现此方法,我在 Starckoverflow 中找到了一篇向您解释了实现方法的帖子,here 您有条目。

      【讨论】:

        猜你喜欢
        • 2015-10-24
        • 1970-01-01
        • 2021-04-19
        • 2011-06-13
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        相关资源
        最近更新 更多