Ответ 1
Решил его следующим запросом:
select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10;
У нас есть столбец эпохи времени (BIGINT), хранящийся в Hive. Мы хотим получить Date 'yyyy-MM-dd' за эту эпоху. Проблема в том, что моя эпоха находится в миллисекундах, например. 1409535303522. Таким образом, выберите timestamp, from_unixtime (timestamp, 'yyyy-MM-dd') дает неправильные результаты для даты, поскольку она ожидает эпоху в секундах.
Итак, я попытался делить его на 1000. Но потом он преобразуется в Double, и мы не можем применить к нему функцию. Даже CAST не работает, когда я пытаюсь преобразовать этот double в Bigint.
Решил его следующим запросом:
select timestamp, from_unixtime(CAST(timestamp/1000 as BIGINT), 'yyyy-MM-dd') from Hadoop_V1_Main_text_archieved limit 10;
В исходном ответе вы получите строку, но если вы хотите получить дату, вам нужно вызвать дополнительный листинг с датой:
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)
timestamp_ms является unixtime в миллисекундах
SELECT from_unixtime (пол (CAST (timestamp_ms AS BIGINT)/1000), 'yyyy-MM-dd HH: mm: ss.SSS') как created_timestamp FROM table_name;