Hive处理多格式字符串日期时识别无效日期返回null的方法咨询
解决方案
方案1:通用往返校验法(兼容所有Hive版本)
核心逻辑为通过日期格式往返匹配判断合法性:将输入字符串按原格式转换为标准日期后,再用相同格式转回字符串,若与原始输入完全一致则为有效日期,否则判定无效返回null。
单格式转换示例:
select case when date_format(to_date(from_unixtime(unix_timestamp('31/02/2021','dd/MM/yyyy'))), 'dd/MM/yyyy') = '31/02/2021' then date_format(to_date(from_unixtime(unix_timestamp('31/02/2021','dd/MM/yyyy'))), 'yyyy-MM-dd') else null end as valid_date;
多格式兼容示例(可同时适配dd/MM/yy、dd/MMM/yyyy等多种格式,返回第一个匹配成功的转换结果):
select coalesce( -- 校验dd/MM/yyyy格式 case when date_format(to_date(from_unixtime(unix_timestamp(date_str,'dd/MM/yyyy'))), 'dd/MM/yyyy') = date_str then date_format(to_date(from_unixtime(unix_timestamp(date_str,'dd/MM/yyyy'))), 'yyyy-MM-dd') end, -- 校验dd/MM/yy格式 case when date_format(to_date(from_unixtime(unix_timestamp(date_str,'dd/MM/yy'))), 'dd/MM/yy') = date_str then date_format(to_date(from_unixtime(unix_timestamp(date_str,'dd/MM/yy'))), 'yyyy-MM-dd') end, -- 校验dd/MMM/yyyy格式 case when date_format(to_date(from_unixtime(unix_timestamp(date_str,'dd/MMM/yyyy'))), 'dd/MMM/yyyy') = date_str then date_format(to_date(from_unixtime(unix_timestamp(date_str,'dd/MMM/yyyy'))), 'yyyy-MM-dd') end ) as valid_date from your_table;
方案2:高版本Hive简化方案(Hive 3.0及以上)
Hive 3.0开始内置try_to_date函数,原生支持无效日期返回null,不会触发自动偏移逻辑,用法如下:
-- 单格式转换 select try_to_date('31/02/2021', 'dd/MM/yyyy') as valid_date; -- 多格式兼容 select coalesce( try_to_date(date_str, 'dd/MM/yyyy'), try_to_date(date_str, 'dd/MM/yy'), try_to_date(date_str, 'dd/MMM/yyyy') ) as valid_date from your_table;
注意事项
使用dd/MMM/yyyy这类包含月份缩写的格式时,需确保Hive会话的locale与日期字符串的语言匹配,英文月份可通过如下参数配置:set hive.session.locale.default=en_US;
内容的提问来源于stack exchange,提问作者Harsh
相关产品推荐
相关产品推荐

