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

如何从PySpark DataFrame列中提取文件扩展名

在PySpark DataFrame中提取文件扩展名的方法

嘿,这个需求我平时处理得挺多,给你两种实用的实现方式,看哪种更适配你的场景:

方法一:用Python UDF封装os.path.splitext

因为os.path.splitext是Python标准库的函数,我们可以把它包装成PySpark的UDF来处理DataFrame列:

先导入必要的模块:

import os
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

接着定义专门提取扩展名的UDF:

get_extension = udf(lambda path: os.path.splitext(path)[1], StringType())

最后用withColumn新增一列(比如命名为FileExtension):

df = df.withColumn("FileExtension", get_extension(df["FullPath"]))

这种方式逻辑直观,如果你已经熟悉os.path.splitext的用法,上手特别快;但要注意,UDF在处理超大规模数据集时,性能可能不如PySpark原生函数。

方法二:使用PySpark内置函数(大数据场景推荐)

如果你的数据集量级很大,优先用原生函数,避免UDF带来的性能开销。这里推荐两种原生实现:

方式A:正则匹配精准提取

用正则表达式匹配路径中最后一个.后面的内容,直接拿到扩展名:

from pyspark.sql.functions import regexp_extract

df = df.withColumn("FileExtension", regexp_extract(df["FullPath"], r'\.([^\.]+)$', 1))

简单解释下正则:\.([^\.]+)$ 会匹配字符串末尾的.,然后捕获后面所有非.的字符,这就是我们要的扩展名。

方式B:分割字符串提取

先按.分割路径,再取分割后的最后一段:

from pyspark.sql.functions import split, element_at

df = df.withColumn("FileExtension", element_at(split(df["FullPath"], "\."), -1))

这种方式要注意:如果路径里有多个.(比如doc.v2.pdf),会返回最后一段pdf,和os.path.splitext结果一致;但如果路径本身没有扩展名(比如data/report),会返回整个文件名,你可以根据需求加个判断处理这种情况。

原生函数的性能比UDF好很多,非常适合生产环境的大数据场景。

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:20