HIVE 转换 unix 时间戳以进行计算

HIVE converting unix timestamp for calculation

我正在尝试在时间戳之间执行减法,并希望将时间戳转换为可以转换为分钟的形式。

我使用 regexp_replace 将时间戳转换成这样的形式:

2020-06-20T17:25:59:378Z

下面的代码会将其转换为秒

unix_timestamp(regexp_replace(value,'(.*?)T(.*?):([^:]*?)Z$',' \.'))  

我还有另外两个时间戳要转换成秒,例如:

2020-03-19 15:45:33
03-19-2020 11:07:25:103

我应该如何使用 regexp_replace() 或任何其他函数将这两个时间戳转换为秒?

谢谢!

对于第一个你真的不需要使用regex_replace。

select unix_timestamp('2020-06-20T17:25:59:378Z','yyyy-MM-dd'T'HH:mm:ss.SSSZ');

还有另外两个

select unix_timestamp('2020-03-19 15:45:33', 'yyyy-MM-dd HH:mm:ss');
select unix_timestamp('03-19-2020 11:07:25:103', 'MM-dd-yyyy HH:mm:ss:SSS');

首先,unix_timestamp returns 秒从 unix 纪元开始。它确实忽略了毫秒。这就是为什么如果你想要以秒为单位的纪元时间,你只能提取 'yyyy-MM-dd HH:mm:ss'.

其次,如果你在一个数据集中有所有这些不同的格式,并且你想将它们全部转换,你可以使用 case 语句来检查模式并进行相应的转换:

with your_data as ( --This is your data example
select stack(3,
             '2020-06-20T17:25:59:378Z',
             '2020-03-19 15:45:33',
             '03-19-2020 11:07:25:103'
            ) as str
)

select case when str rlike '^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2})' --matches first two strings
             then unix_timestamp(regexp_replace(str,'^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2})',' '))
            when str rlike '^(\d{2})-(\d{2})-(\d{4})[T ](\d{2}:\d{2}:\d{2})' --matches third string, allows T or space after date
             then unix_timestamp(regexp_replace(str,'^(\d{2})-(\d{2})-(\d{4})[T ](\d{2}:\d{2}:\d{2})','-- '))
        end result_unix_timestamp
from your_data

Returns:

result_unix_timestamp
1592673959
1584632733
1584616045

您可以在案例中添加更多的模式并进行相应的转换,从而转换所有可能的案例。当然,也不一定所有情况下都应该使用regex_replace进行转换。虽然正则表达式允许识别和解析最复杂的字符串。

您也可以尝试使用一种模式进行转换,如果它 returns null 则尝试使用另一种模式进行转换,依此类推:

coalesce(unix_timestamp(regexp_replace(str,'^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2})',' ')),
         unix_timestamp(regexp_replace(str,'^(\d{2})-(\d{2})-(\d{4})[T ](\d{2}:\d{2}:\d{2})','-- '))
        )