如何在hive中将unix纪元时间转换为日期字符串

pri*_*ank 20 hive function database-partitioning

我有一个包含时间戳列的日志文件.时间戳采用unix纪元时间格式.

我想基于具有分区年,月和日的时间戳创建分区.

到目前为止,我已经做到了这一点,但它正在抛出错误.

PARSE ERROR cannot recognize input '(' in column type
Run Code Online (Sandbox Code Playgroud)

这是我的代码.

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;
Run Code Online (Sandbox Code Playgroud)

小智 44

哦,这看起来很难看.尝试在Hive中使用此功能:

SELECT from_unixtime(unix_timestamp) as new_timestamp from raw_data ...
Run Code Online (Sandbox Code Playgroud)

或者如果时间戳是在ms秒而不是秒:

SELECT from_unixtime(unix_timestamp DIV 1000) as new_timestamp from raw_data ...
Run Code Online (Sandbox Code Playgroud)

将unix时间戳转换为YYYY-MM-DD HH:MM:SS格式,然后您可以使用以下函数来获取年,月和日:

SELECT year(new_timestamp) as year, month(new_timestamp) as month, day(new_timestamp) as day ...
Run Code Online (Sandbox Code Playgroud)

  • 确保`timestamp_value`(此处为`unix_timestamp`)以秒为单位,否则使用`from_unixtime(timestamp_value DIV 1000)` (2认同)

小智 8

随着最新版本的Hive和SparkSQL,可以使用日期和类型转换选项的数据类型.以下应该在Hive和Spark SQL中工作

SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable
Run Code Online (Sandbox Code Playgroud)


Abd*_*nan 6

如果您需要以自定义格式转换日期,请使用以下命令:

select date_format(from_unixtime(epoch_datetime),'yyyyMM') as formatted_date from myHiveTable;
Run Code Online (Sandbox Code Playgroud)


这将返回日期,例如201708年