How to convert string date to big int in hive with milliseconds

时间:2017-06-20 12:36:10

标签: hadoop hive bigdata

I have a string 2013-01-01 12:00:01.546 which represents a timestamp with milliseconds that I need to convert to a bigint without losing the milliseconds.

I tried unix_timestamp but I lose the milliseconds:

unix_timestamp(2013-01-01 12:00:01.546,'yyyy-MM-dd HH:mm:ss') ==> 1357059601
unix_timestamp(2013-01-01 12:00:01.786,'yyyy-MM-dd HH:mm:ss') ==> 1357059601

I tried with milliseconds format as well but no difference

unix_timestamp(2013-01-01 12:00:01.786,'yyyy-MM-dd HH:mm:ss:SSS') ==> 1357059601

Is there any way to get milliseconds difference in hive?

3 个答案:

答案 0 :(得分:2)

这是我到目前为止所得到的 如果所有时间戳都只有3位数,则可以简化。

with t as (select timestamp '2013-01-01 12:00:01.546' as ts)
select  cast ((to_unix_timestamp(ts) + coalesce(cast(regexp_extract(ts,'\\.\\d*',0) as decimal(3,3)),0)) * 1000 as bigint)
from    t
  

1357070401546

验证结果:

select from_utc_timestamp (1357070401546,'UTC')
  

2013-01-01 12:00:01.546000

答案 1 :(得分:0)

显然unix_timestamp没有转换毫秒。您可以使用以下方法。

hive> select unix_timestamp(cast(regexp_replace('2013-01-01 12:00:01.546', '(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})', '$1-$2-$3 $4:$5:$6.$7' ) as timestamp));
OK
1357063201

答案 2 :(得分:0)

Hive 函数 unix_timestamp() 不会转换毫秒部分,因此您可能需要使用以下内容:

unix_timestamp('2013-01-01 12:00:01.546') + cast(split('2013-01-01 12:00:01.546','\\\.')[1] as int) => 1357067347
unix_timestamp('2013-01-01 12:00:01.786') + cast(split('2013-01-01 12:00:01.786','\\\.')[1] as int) => 1357067587