【问题标题】:hive time_stamp convert into UTC with time_offset in UTChive time_stamp 转换为 UTC,time_offset 为 UTC
【发布时间】:2017-08-01 18:02:36
【问题描述】:

我有 2 列:time_stamp 和 time_offset。两者都是STRING 数据类型。 我们如何在 UTC 中的第二列的帮助下将一列值转换为 UTC?他们是否有任何配置单元或来自 unix 解决方案来将 time_stamp 列转换为 UTC?

  hive> select time_stamp from table1 limit 2;
    OK
    20170717-22:31:57.348
    20170719-21:10:15.393

[yyyymmdd-hh:mm:ss.msc] this column is in local time

    hive> select time_offset from table1 limit 2;
    OK
    -05:00
    +05:00

[‘+hh:mm’ or ‘-hh:mm’ ] this column is in UTC

【问题讨论】:

    标签: unix hadoop hive apache-pig hadoop2


    【解决方案1】:

    您可以使用 Hive Date Functions unix_timestampfrom_unixtime 来执行转换。

    代码

    WITH table1 AS (
        SELECT '20170717-22:31:57.348' AS time_stamp, '-05:00' AS time_offset UNION ALL
        SELECT '20170719-21:10:15.393' AS time_stamp, '+05:00' AS time_offset
    )
    SELECT
        time_stamp,
        time_offset,
        unix_timestamp(concat(time_stamp, ' ', time_offset), 'yyyyMMdd-HH:mm:ss.SSS X') AS unix_timestamp_with_offset,
        from_unixtime(unix_timestamp(concat(time_stamp, ' ', time_offset), 'yyyyMMdd-HH:mm:ss.SSS X'), 'yyyyMMdd-HH:mm:ss.SSS') AS string_timestamp_with_offset
    FROM table1
    ;
    

    结果集

    +------------------------+--------------+-----------------------------+-------------------------------+--+
    |       time_stamp       | time_offset  | unix_timestamp_with_offset  | string_timestamp_with_offset  |
    +------------------------+--------------+-----------------------------+-------------------------------+--+
    | 20170717-22:31:57.348  | -05:00       | 1500348717                  | 20170717-20:31:57.000         |
    | 20170719-21:10:15.393  | +05:00       | 1500480615                  | 20170719-09:10:15.000         |
    +------------------------+--------------+-----------------------------+-------------------------------+--+
    

    说明

    unix_timestamp 可以接受与 Java SimpleDateFormat 语法相同的可选格式字符串。我猜你的偏移量使用ISO 8601 语法,所以让我们使用X 格式说明符。然后,我们可以使用concat String Operatortime_stamptime_offset 组合起来,然后再传递给unix_timestamp

    unix_timestamp 函数产生一个数字时间戳,指定为自纪元以来的秒数。要将其转换回字符串表示形式,我们可以将从unix_timestamp 获得的结果传递到from_unixtime,这次指定我们的原始格式说明符。

    (请彻底测试以确保结果在您的环境中有意义。时区数学可能会很棘手。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2014-11-18
      • 2011-03-15
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多