PySpark提取DataFrame邮箱列报错:TypeError问题求助
解决PySpark提取邮箱列的报错与实现方案
错误原因
- UDF逻辑错误:你的
extract函数错误地将UDF传入的单个字符串值当成了行集合,使用for row in col循环会把字符串拆分为单个字符,导致re.findall接收的是字符而非完整字符串,触发TypeError。 - 正则表达式缺陷:原正则
r'\w+.\w+@\w+.\w+'无法匹配含点的用户名(如john.snow)和多级域名,且未利用邮箱包裹在<>中的特征,容易误匹配。
解决方案
方案1:修正UDF实现
调整UDF逻辑,直接处理单个字符串,并优化正则表达式:
import re from pyspark.sql.functions import udf from pyspark.sql.types import ArrayType, StringType def extract_emails(text): # 匹配<和>之间的内容,提取所有邮箱 return re.findall(r'<([^>]+)>', text) if text else [] extract_udf = udf(extract_emails, ArrayType(StringType())) # 替换为你的目标列名Email_Col df = df.withColumn("New_Email_Col", extract_udf(df["Email_Col"]))
方案2:使用PySpark内置函数(推荐,性能更优)
PySpark 3.1+提供regexp_extract_all函数,无需自定义UDF,直接提取所有匹配项:
from pyspark.sql.functions import regexp_extract_all df = df.withColumn( "New_Email_Col", regexp_extract_all(df["Email_Col"], r'<([^>]+)>', 1) )
regexp_extract_all的第三个参数是捕获组索引,这里捕获<>内的内容(捕获组1),函数会自动返回包含所有匹配结果的数组。
两种方案均能处理你提供的示例数据,生成符合期望的数组类型邮箱列。
内容的提问来源于stack exchange,提问作者jabeono
相关产品推荐
相关产品推荐

