需要在pig中以特定格式将chararray转换为datetime

xqkwcwgp  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(405)

在我的pig代码中,变量事件日期的计算方式如下:

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;

事件日期如下(例如):2018-04-30 00:00:00.0(注意:所有小时、秒、分钟应为零)
在ddl表(计算完成后存储事件日期变量)中,事件日期变量定义为:

........
,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格式更改为datetime,使其所有的小时、分钟、秒部分都为零。
为此,我尝试了两件事:
通过在substring之外使用todate()函数,但pig中不支持此操作。如果不存在子字符串,那么我可以使用todate函数。
我使用了下面的计算方法,使用它,事件日期是以日期时间格式出现的,但它看起来是这样的(例如: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; 我应该怎么做才能使事件日期的变量计算看起来像2018-04-30 00:00:00.0,并且应该是日期时间格式?

yqkkidmi

yqkkidmi1#

如果join\u start\u 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;

相关问题