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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:01:09