Hive:如何转换毫秒时间戳?

时间:2017-06-20 13:15:22

标签: hadoop hive sparklyr

我正在尝试使用HIVE UDFshttps://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions) 从Sparklyr正确读入一些时间戳。

不幸的是,我无法正确解析以下时间戳:

unix_timestamp('2011-03-01T00:00:04.226Z', 'yyyy-MM-ddThh:mm:ss.SSS' ) 

返回NA s ..

有什么想法吗?这里的模式是什么? 谢谢!

1 个答案:

答案 0 :(得分:3)

您需要引用TZ

hive> select unix_timestamp('2011-03-01T00:00:04.226Z', "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'" );
OK
1298959204

如果你不害怕笨拙,试试这个:

select unix_timestamp(cast(regexp_replace('2011-03-01T00:00:04.226Z', '(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}).(\\d{3})Z', '$1-$2-$3 $4:$5:$6.$7' ) as timestamp))

要从EST转换为UTC,请使用以下内容:

hive> select to_utc_timestamp(unix_timestamp('2011-03-01T00:00:04.226Z', "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'" )*1000, 'EST');
OK
2011-03-01 05:00:04

需要使用1000进行乘法,因为来自Hive Language Manual

  

小数值被视为秒。整数值被视为毫秒。例如to_utc_timestamp(2592000.0,'PST'),to_utc_timestamp(2592000000,'PST')和to_utc_timestamp(时间戳'1970-01-30 16:00:00','PST')都返回时间戳1970-01-31 00:00:00