【问题标题】:Hive: how to convert millisecond timestamps?Hive:如何转换毫秒时间戳?
【发布时间】:2017-11-23 01:28:47
【问题描述】:

我正在尝试使用HIVE UDFs (https://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' ) 

返回NAs..

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

【问题讨论】:

    标签: hadoop hive sparklyr


    【解决方案1】:

    你需要引用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(timestamp '1970-01-30 16:00:00','PST') 都返回时间戳 1970-01-31 00:00:00

    【讨论】:

    • 返回一个 bigint 类型。你知道为什么我不能使用to_utc_timestamp(mytime, 'EST'),而mytime 是我们刚刚创建的unix_timestamp?您如何将其转换为时间戳类型?
    • @Noobie 我想是因为 unix_timestamp 函数就是这样工作的。
    • 不太清楚这是怎么回事。你正在失去毫秒,而我没有?那很奇怪。 :D
    • 括号之间的任何内容都将被视为一组,因此一开始的(\\d{4}) 是我使用$1 访问的第1 组。以此类推。
    • 另外,您在使用unix_timestamp 时得到的差异很可能是由于我们的时区不同。
    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2013-03-09
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多