Hive 来自_UNIXTIME()的配置单元(毫秒)

Hive 来自_UNIXTIME()的配置单元(毫秒),hive,Hive,我已经看过足够多的文章,其中我们除以1000或转换从毫秒到时间戳的时间。我想知道如何在时间戳中保留毫秒片段 1440478800123最后3个字节为毫秒。如何将其转换为YYYYMMDDHHMMSS.sss 我还需要捕获转换的时间戳中的毫秒部分 谢谢用java创建配置单元udf package com.kishore.hiveudf; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.

我已经看过足够多的文章,其中我们除以1000或转换从毫秒到时间戳的时间。我想知道如何在时间戳中保留毫秒片段

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

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


谢谢

用java创建配置单元udf

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;
    }
}
导出为TimestampToDateUDF.jar

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

select * from tableA;                                                           
OK
1440753288123
Time taken: 0.071 seconds, Fetched: 1 row(s)
hive> select toDate(timestamp) from tableA;
OK
201508240144448:123
Time taken: 0.08 seconds, Fetched: 1 row(s)
实际上是有效的,因为当强制转换到时间戳时(与使用from_unixtime()相反),Hive似乎假定int或bigint为毫秒。浮点类型被视为秒。据我所知,这是未记录的,可能是一个bug。我想要一个包含时区的字符串(这可能很重要——特别是当服务器更改为夏令时/夏令时时),并希望在cast功能更改时明确转换。因此,这给出了一个ISO 8601日期(根据需要调整另一种格式的格式字符串)


先生,我已经看过文件了。转换后它不会保留毫秒。谢谢。当我尝试强制转换时,它会抛出Null,当我使用另一个选项时,查询无法在from_unixtime中对Printf语句求值
select cast(epoch_ms as timestamp)
select from_unixtime(
   floor(  epoch_ms / 1000   )
 , printf( 'yyyy-MM-dd HH:mm:ss.%03dZ',  epoch_ms % 1000  )
 )