You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:24:02