Spark如何筛选日期列包含Z外字母字符的异常行?
解决Spark SQL筛选日期字段混入文本的问题
问题原因
你原来用的LIKE '%[a-zA-Y]%'无法生效,是因为Spark SQL的LIKE仅支持%(任意长度字符)和_(单个字符)两种通配符,不支持正则表达式的字符类语法。要实现正则匹配,得用RLIKE或REGEXP操作符。
两种解决方案
方案1:筛选包含非法字符的行
正常日期格式里仅允许出现T、Z(如果字段存在小写t/z,需补充进规则),我们可以匹配包含这两个字符之外的字母或其他非法字符的行:
SELECT * FROM db.table -- 匹配非数字、非减号、非冒号、非T/Z的字符 WHERE date RLIKE '[^0-9\\-:TZ]' -- 若需兼容小写t/z,替换为以下正则 -- WHERE date RLIKE '[^0-9\\-:TtZz]'
方案2:筛选不符合标准格式的行
更严谨的方式是直接匹配标准日期格式,筛选不匹配的行。标准格式2023-02-04T07:01:02Z对应的正则如下:
SELECT * FROM db.table WHERE date NOT RLIKE '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$'
这种方法不仅能筛选混入文本的行,还能找出日期逻辑无效的行(比如月份为13、日期为32等)。
内容的提问来源于stack exchange,提问作者user3486773
相关产品推荐
相关产品推荐

