как преобразовать строку времени эпохи 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;