Spark SQL正则表达式中如何添加基于unix_timestamp的日期校验功能
正确实现代码
spark.sql(""" SELECT CASE WHEN LENGTH(num_str) = 8 THEN CASE -- 首次校验是否符合yyyyMMdd格式,符合直接输出 WHEN UNIX_TIMESTAMP(num_str, 'yyyyMMdd') IS NOT NULL THEN num_str -- 校验失败则转换为YYYYMMDD格式后二次校验,符合则输出转换后结果 WHEN UNIX_TIMESTAMP(CONCAT(SUBSTR(num_str, 5, 4), SUBSTR(num_str, 1, 4)), 'yyyyMMdd') IS NOT NULL THEN CONCAT(SUBSTR(num_str, 5, 4), SUBSTR(num_str, 1, 4)) -- 两次校验均失败可自定义返回规则,此处默认保留原始提取数字 ELSE num_str END -- 非8位数字场景可自定义返回规则,此处默认返回提取到的数字 ELSE num_str END AS dt FROM ( -- 子查询提前提取所有数字,避免重复调用正则替换提升可读性和性能 SELECT REGEXP_REPLACE(date, '[^0-9]', '') AS num_str FROM input ) t """).show(false)
核心逻辑说明
- 利用
unix_timestamp的特性:输入字符串与指定格式不匹配时返回null,作为格式校验的判断依据 - MMDDYYYY转YYYYMMDD直接通过字符串截取拼接实现:取8位数字的后4位(年份)拼上前4位(月+日),逻辑更直接高效
- 子查询提前提取数字字段,避免重复写正则替换逻辑,可维护性更高
原有代码的问题
你之前的写法在校验MMddyyyy格式成功后,仍然用MMddyyyy格式做输出格式化,没有做日期顺序转换,因此无法得到预期的YYYYMMDD格式结果。
内容的提问来源于stack exchange,提问作者Only developer
相关产品推荐
相关产品推荐

