Hive FROM_UNIXTIME(),毫秒

时间:2015-08-26 21:56:46

标签: hive

我已经看到足够的帖子,我们除以1000或转换为从毫秒纪元时间转换为时间戳。我想知道如何在时间戳中保留毫秒数。

1440478800123最后3个字节是毫秒。如何将其转换为YYYYMMDDHHMMSS.sss

之类的内容

我还需要在转换后的时间戳中捕获毫秒部分

由于

2 个答案:

答案 0 :(得分:5)

select cast(epoch_ms as timestamp)

实际上有效,因为当转换为时间戳(而不是使用from_unixtime())时,Hive似乎假设int或bigint是毫秒。浮点类型被视为秒。据我所知,这是没有记录的,也可能是一个错误。我想要一个包含时区的字符串(这可能很重要 - 特别是如果服务器更改为夏令时/夏令时),并希望在转换功能发生变化时明确转换。因此,这给出了ISO 8601日期(根据需要调整格式字符串为另一种格式)

select from_unixtime(
   floor(  epoch_ms / 1000   )
 , printf( 'yyyy-MM-dd HH:mm:ss.%03dZ',  epoch_ms % 1000  )
 )

答案 1 :(得分:3)

在java中创建一个hive udf

word word
word
word

导出为TimestampToDateUDF.jar

package com.kishore.hiveudf;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.udf.UDFType;

@UDFType(stateful = true)
public class TimestampToDateUDF extends UDF {
    String dateFormatted;
    public String evaluate(long timestamp) {
        Date date = new Date(timestamp);
        DateFormat formatter = new SimpleDateFormat("YYYYMMDDHHmmss:SSS");
        dateFormatted = formatter.format(date);
        return dateFormatted;
    }
}

输出

hive> ADD JAR /home/kishore/TimestampToDate.jar; 
hive> create TEMPORARY FUNCTION toDate AS 'com.kishore.hiveudf.TimestampToDateUDF' ;