как преобразовать строку времени эпохи unix в строку даты в hive
у меня есть файл журнала, который содержит столбец timestamp. Метка времени находится в формате времени эпохи unix.
Я хочу создать раздел на основе метки времени с разделами год, месяц и день.
до сих пор я сделал это, но он бросает ошибку.
PARSE ERROR cannot recognize input '(' in column type
вот мой код.
from (
from raw_data
MAP ${PREFIX}raw_data.line
USING 's3://scripts/clean.py'
AS (timestamp STRING, name STRING)
) map_out
INSERT OVERWRITE TABLE date_base_data_temp PARTITION(year(timestamp), month(timestamp)), day(timestamp)))
select map_out.name;
4 ответов
Уф, это выглядит уродливо. Попробуйте использовать эту функцию в улье:
SELECT from_unixtime(unix_timestamp) as new_timestamp from raw_data ...
или если метка находится в ms
вместо секунд:
SELECT from_unixtime(unix_timestamp DIV 1000) as new_timestamp from raw_data ...
который преобразует метку времени unix в формат гггг-ММ-ДД чч:мм:СС, то вы можете использовать следующие функции, чтобы получить год, месяц и день:
SELECT year(new_timestamp) as year, month(new_timestamp) as month, day(new_timestamp) as day ...
С более поздними выпусками Hive и SparkSQL доступны параметры типа даты и типа литья. Следующее должно работать в Hive, а также Spark SQL
SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable
Если вам нужно преобразовать дату в пользовательский формат, используйте это:
select date_format(from_unixtime(epoch_datetime),'yyyMM') as formatted_date from myHiveTable;
который вернет дату как yearMonth, например 201708
добавление этого запроса в список, где метка времени должна быть преобразована в строку даты гггг-ММ-ДД для строкового раздела:
hive> select date_format(from_unixtime(epoch_datetime), 'yyyy-MM-dd') as day from table_name limit 20;
-- If required, remove the millis precision for timestamps
hive> select date_format(from_unixtime(cast(epoch_datetime/1000 as bigint)), 'yyyy-MM-dd') as day from table_name limit 20;