在Pig中如何将chararray转换为时分秒全为0的datetime格式?
解决Pig中生成时分秒为0的datetime类型event_date问题
我来帮你搞定这个日期处理的需求!你需要把join_start_ts转换为datetime(timestamp)类型,同时强制时分秒部分为00:00:00.0,下面是可行的方案:
问题分析
你之前的尝试遇到的问题:
- 直接在
SUBSTRING外层套ToDate失败,是因为Pig的ToDate函数需要明确的格式匹配,单独截取的日期字符串如果不补充时间部分并指定格式,无法正确转换为datetime - 直接用
ToDate(join_start_ts)会保留原始字符串中的时分秒信息,所以达不到清零的效果
正确的实现代码
我们可以先截取日期部分,拼接固定的零时零分零秒字符串,再通过ToDate指定格式转换为datetime类型,代码如下:
case when join_start_ts is NULL or TRIM(join_start_ts) == '' then NULL else ToDate(CONCAT(SUBSTRING(join_start_ts, 0, 10), ' 00:00:00.0'), 'yyyy-MM-dd HH:mm:ss.S') end as event_date;
逻辑说明
- 空值处理:保持你原有的判断,当
join_start_ts为空或空字符串时返回NULL - 截取日期部分:通过
SUBSTRING(join_start_ts, 0, 10)提取前10位的日期字符串(比如2018-04-30) - 拼接固定时间:用
CONCAT把日期字符串和00:00:00.0拼接,得到完整的目标日期时间字符串 - 转换为datetime:通过
ToDate函数并指定格式yyyy-MM-dd HH:mm:ss.S,将拼接后的字符串转换为datetime类型,最终结果就是2018-04-30 00:00:00.0这样的timestamp类型值
这样处理后,event_date的类型完全符合你DDL中定义的timestamp,同时满足时分秒全为0的要求。
内容的提问来源于stack exchange,提问作者Bhuvi007
相关产品推荐
相关产品推荐

