在我的猪代码中,变量event_date的计算方式如下:
SUBSTRING(case when join_start_ts is NULL or TRIM(join_start_ts)=='' then 'null' else join_start_ts end,0,10) as event_date;
event_date如下所示的位置(例如(:2018-04-30 00:00:00.0(注意:所有小时、秒、分钟都应为零(
在 DDL 表中(计算完成后存储event_date变量(,event_date变量定义为:
........
,event_date timestamp
)
PARTITIONED BY (data_input_date string)
stored as orc
location
'${hiveconf:s3bucket}/${hiveconf:fact_path}/${hiveconf:join_failure_fact}/'
TBLPROPERTIES ("orc.compress"="snappy");
在进行计算时(如上所示(,我只想event_date格式更改为日期时间,使其所有小时、分钟、秒部分均为零。
为此,我尝试了两件事:
- 通过在 SUBSTRING 之外使用 todate(( 函数,但在Pig 中不支持。如果没有子字符串存在,那么我可以使用ToDate函数。
我使用了下面的计算方法并使用它,event_date以日期时间格式出现,但它看起来像这样(例如(:2018-04-30 17:03:50.798(我希望所有小时,秒,分钟均为零(
(case when join_start_ts is NULL or TRIM(join_start_ts)=='' then NULL else ToDate(join_start_ts) end) as eventdate;
我应该怎么做,以便在event_date的变量计算中,它看起来像 2018-04-30 00:00:00.0 并且应该采用日期时间格式?
如果join_start_ts已经是所需的日期时间格式,但作为字符串,那么您可以使用substring
获取日期部分,然后concat
'00:00:00.0'。如果以毫秒为单位或采用其他格式,请使用todate, tostring, substring, and concat
.最后把它扔回日期时间。
(case
when join_start_ts is NULL or TRIM(join_start_ts) == '' then NULL
else Concat(SubString(join_start_ts,0,11),'00:00:00.0')
end) as eventdate;
或
(case
when join_start_ts is NULL or TRIM(join_start_ts) == '' then NULL
else Concat(SubString(ToString(ToDate(join_start_ts)),0,11),'00:00:00.0')
end) as eventdate;