如何在Hive中将字符串转换为时间戳,以毫秒为单位

时间:2014-10-14 07:37:55

标签: hadoop timestamp hive

我有一个字符串'20141014123456789',它表示我需要转换为Hive(0.13.0)中的时间戳而不会丢失毫秒的时间戳(毫秒)。

我尝试了这个,但unix_timestamp返回一个整数,所以我失去了毫秒:

from_unixtime(unix_timestamp('20141014123456789', 'yyyyMMddHHmmssSSS'))      >> 2014-10-14 12:34:56    

投射字符串有效:

cast('2014-10-14 12:34:56.789' as timestamp)      >> 2014-10-14 12:34:56.789

但我的字符串不是那种形式。

我想我需要将我的字符串从'20141014123456789'重新格式化为'2014-10-14 12:34:56.789'。我的挑战是如何在没有子串的混乱连接的情况下做到这一点。

5 个答案:

答案 0 :(得分:9)

我找到了一种方法,可以使用以下代码避免混乱的子串连接:

select cast(regexp_replace('20141014123456789', 
                           '(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{3})',
                           '$1-$2-$3 $4:$5:$6.$7') as timestamp) 

答案 1 :(得分:0)

我不认为这可以在没有混乱的情况下完成。因为根据unix_timestamp()函数文档,它返回的时间是秒,因此将省略毫秒部分。

“将给定模式的时间字符串转换为Unix时间戳(以秒为单位),如果失败则返回0:unix_timestamp('2009-03-20','yyyy-MM-dd ')= 1237532400。“

这里最好的选择是编写一个UDF来处理这个你想避免混乱的连接。然而,连接(虽然凌乱)对工作会更好。

答案 2 :(得分:0)

我的日期字段为 2015-07-22T09:00:32.956443Z (存储为字符串)。我需要做一些日期操作。 以下命令即使有点凌乱也不适合我:)

select cast(concat(concat(substr(date_created,1,10),' '),substr(date_created,12,15)) as timestamp) from tablename;

这看起来令人困惑但如果你把它分解就很容易了。 用毫秒提取日期和时间,并在其间连接一个空格,然后连接整个事物并将其转换为时间戳。现在,这可以用于日期或时间戳操作。

答案 3 :(得分:0)

假设您的表格中有一列'birth_date',它是字符串格式, 您应该使用以下查询来使用birth_date进行过滤

date_Format(birth_date, 'yyyy-MM-dd HH:mm:ssSSS')

您可以通过以下方式在查询中使用它

select * from yourtable
where 
date_Format(birth_date, 'yyyy-MM-dd HH:mm:ssSSS') = '2019-04-16 07:12:59999';

答案 4 :(得分:-1)

一个简单的策略是使用date_format(arg1, arg2),其中arg1是时间戳,可以是格式化的字符串,日期或时间戳,arg2是字符串的格式(在{中{1}})。有关format参数中可接受的内容,请参阅arg1 java文档。

所以,在这种情况下:

SimpleDateFormat

将产生以下字符串:date_format('20141014123456789', 'yyyyMMddHHmmssSSS') ,然后可以将其转换为时间戳:

'2014-10-14 12:34:56.789'

上述语句将返回时间戳(根据需要)。