需要在PIG中以特定格式将chararray转换为日期时间

时间:2018-05-18 13:22:49

标签: apache-pig etl orc

在我的pig代码中,变量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格式更改为datetime,使其所有小时,分钟,秒部分都为零。

为此,我尝试了两件事:

  • 在SUBSTRING之外使用todate()功能,但猪不支持。如果没有SUBSTRING,那么我可以使用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并且应该是日期时间格式?

1 个答案:

答案 0 :(得分: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;

OR

(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;