我已经看到足够的帖子,我们除以1000或转换为从毫秒纪元时间转换为时间戳。我想知道如何在时间戳中保留毫秒数。
1440478800123最后3个字节是毫秒。如何将其转换为YYYYMMDDHHMMSS.sss
之类的内容我还需要在转换后的时间戳中捕获毫秒部分
由于
答案 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' ;