您可以使用 Hive Date Functions unix_timestamp 和 from_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 Operator 将time_stamp 和time_offset 组合起来,然后再传递给unix_timestamp。
unix_timestamp 函数产生一个数字时间戳,指定为自纪元以来的秒数。要将其转换回字符串表示形式,我们可以将从unix_timestamp 获得的结果传递到from_unixtime,这次指定我们的原始格式说明符。
(请彻底测试以确保结果在您的环境中有意义。时区数学可能会很棘手。)