使用PySpark校验电子邮箱地址时输出不符合预期该如何处理?
PySpark邮箱校验代码问题排查与修复
现有代码存在的问题
- 逻辑方向错误:使用
regexp_extract_all是提取字符串中符合规则的子串,不是校验整个邮箱地址是否合法。输入的alcaraz@lcc@uma.es包含两个@符号,正则会匹配到后半段符合规则的子串,自然不会返回无效提示。 - 正则语法错误:
regexp_replace步骤的正则遗漏了字符集括号,^a-zA-Z0-9@\._\-实际是匹配开头的指定字符,而不是替换非法字符,正确的非法字符匹配写法应为[^a-zA-Z0-9@\._\-]。 - 缺少全匹配限制:提取用的正则没有首尾加
^和$锚点,只要字符串中存在符合规则的子串就会被提取,无法校验整串合法性。 - 缺失判断逻辑:没有针对不合法的邮箱做分支处理,自然无法输出指定的无效提示。
修复后代码
直接使用rlike做全串正则匹配,配合条件分支输出结果即可:
from pyspark.sql import functions as F # 通用邮箱全匹配正则,首尾加锚点限制整串校验 email_rule = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" df_result = df.withColumn( df.columns[0], F.when( F.lower(F.col(df.columns[0])).rlike(email_rule), F.col(df.columns[0]) ).otherwise(F.lit("invalid email address")) )
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

