2015-08-26 4 views
2

Я видел достаточно сообщений, на которых мы делимся на 1000 или заказываем, чтобы конвертировать из эпохи Миллисекунд в временную метку. Я хотел бы знать, как мы можем сохранить миллисекундную часть в метке времени.Hive FROM_UNIXTIME() с миллисекундами

144047880Последние 3 байта - миллисекунды. Как я преобразовать это что-то вроде YYYYMMDDHHMMSS.sss

мне нужно, чтобы захватить часть миллисекунды также в преобразованном метки времени

Благодаря

+1

Я просмотрел документацию сэр. он не сохранит миллисекунду после преобразования. Спасибо. – logic4funi

ответ

3

создать улей UDF в Java

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; 
    } 
} 

экспорт as 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) 
+0

Вы можете изменить формат даты в соответствии с вашими потребностями –

2
select cast(epoch_ms as timestamp) 

на самом деле работает, потому что при забросе на метку времени (в отличие от использования FROM_UNIXTIME()), улей, кажется, допускают INT или BIGINT является миллисекунды. Тип с плавающей точкой рассматривается как секунды. Это недокументировано, насколько я могу судить, и, возможно, ошибка. Мне нужна строка, которая включает часовой пояс (что может быть важно, особенно если сервер меняется на летнее/летнее время), и хотел бы быть явным о преобразовании в случае изменения функциональности трансляции. Таким образом, это даёт дату ISO 8601 (скорректируйте строку формата по мере необходимости для другого формата)

select from_unixtime(
    floor( epoch_ms/1000 ) 
, printf('yyyy-MM-dd HH:mm:ss.%03dZ', epoch_ms % 1000 ) 
) 
Смежные вопросы