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)
小智 8
随着最新版本的Hive和SparkSQL,可以使用日期和类型转换选项的数据类型.以下应该在Hive和Spark SQL中工作
SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable
Run Code Online (Sandbox Code Playgroud)
如果您需要以自定义格式转换日期,请使用以下命令:
select date_format(from_unixtime(epoch_datetime),'yyyyMM') as formatted_date from myHiveTable;
Run Code Online (Sandbox Code Playgroud)
这将返回日期,例如201708年