Улей from_unixtime за миллисекунды

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

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

Ответ 1

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

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

Ответ 2

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

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)
Если строка находится в форме "YYYY-MM-DD", то возвращается значение даты, соответствующее этому году/месяцу/дню. Если строковое значение не соответствует этому формату, возвращается NULL.

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

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

Ответ 3

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

SELECT from_unixtime (пол (CAST (timestamp_ms AS BIGINT)/1000), 'yyyy-MM-dd HH: mm: ss.SSS') как created_timestamp FROM table_name;