Hive from_unixtime на миллисекунды

У нас есть столбец эпохи метки времени (BIGINT), хранящийся в Hive. Мы хотим получить дату 'yyyy-MM-dd' для этой эпохи. Проблема в том, что моя эпоха в миллисекундах, например. 1409535303522. Итак, выберите временную метку from_unixtime (timestamp, 'yyyy-MM-dd') дает неправильные результаты для даты, поскольку она ожидает эпоху в секундах.

Итак, я попытался разделить его на 1000. Но затем он преобразуется в Double, и мы не можем применить к нему функцию. Даже CAST не работает, когда я пытаюсь преобразовать этот двойник в Bigint.


person Sourabh Potnis    schedule 14.01.2015    source источник
comment
Если вы измените формат на «гггг-ММ-дд ЧЧ: мм: сс.ССС»?   -  person LiMuBei    schedule 14.01.2015


Ответы (4)


Решил это по следующему запросу:

select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10;
person Sourabh Potnis    schedule 15.01.2015
comment
это не работает .. это дает ошибку - Нет подходящего метода для класса org.apache.hadoop.hive.ql.udf.UDFFromUnixTime с (double, string). - person Arnab; 30.07.2016

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

select 
    timestamp, 
    cast(from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') as date) as date_col 
from Hadoop_V1_Main_text_archieved 
limit 10;

Документы для преобразования дат и отметок времени. Для преобразования строки в дату:

cast(string as date)
Если строка имеет формат «ГГГГ-ММ-ДД», то возвращается значение даты, соответствующее этому году / месяцу / дню. Если строковое значение не соответствует этому формату, возвращается NULL.

Тип даты доступен только в Hive> 0.12.0, как указано здесь:

DATE (Примечание: доступно только начиная с Hive 0.12.0)

person Anton Protopopov    schedule 21.02.2017

Тип должен быть double, чтобы не потерять точность:

select from_unixtime(cast(1601256179170 as double)/1000.0, "yyyy-MM-dd hh:mm:ss.SSS") as event_timestamp
person NicolasLi    schedule 03.11.2020

timestamp_ms - unixtime в миллисекундах

ВЫБЕРИТЕ from_unixtime (floor (CAST (timestamp_ms AS BIGINT) / 1000), 'yyyy-MM-dd HH: mm: ss.SSS') как created_timestamp FROM table_name;

person anjaneyulu yarrapothu    schedule 01.09.2016