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

Spark DataFrame中提取filename列最后一段文件名的方法问询

嗨,我来帮你搞定这个问题!你已经用split把filename拆成数组了,只是不知道怎么取最后一个元素对吧?Spark里有好几种简单的方法可以实现:

方法1:用element_at直接取最后一个元素(推荐,Spark 2.4+可用)

Spark 2.4及以上版本提供了element_at函数,直接传入数组列和-1就能获取数组的最后一个元素,非常简洁:

from pyspark.sql.functions import element_at, split, col

# 替换原filename列
df = df.withColumn("filename", element_at(split(col("filename"), "/"), -1))

方法2:结合split和size函数取索引

如果你的Spark版本比较旧,不支持element_at,可以先通过size获取数组的长度,再用长度-1作为索引来取最后一个元素:

from pyspark.sql.functions import split, size, col

# 先拆分出数组,再根据长度取最后一个元素
df = df.withColumn(
    "filename",
    split(col("filename"), "/")[size(split(col("filename"), "/")) - 1]
)

如果担心重复计算split影响效率,也可以先把数组存为临时列,用完再删掉:

df = df.withColumn("temp_array", split(col("filename"), "/")) \
       .withColumn("filename", col("temp_array")[size(col("temp_array")) - 1]) \
       .drop("temp_array")

方法3:用正则表达式直接提取

不想拆分数组的话,还可以用regexp_extract直接匹配最后一个斜杠后的内容,一步到位:

from pyspark.sql.functions import regexp_extract

# 正则表达式".*/(.*)"会匹配到最后一个斜杠,捕获后面的所有内容
df = df.withColumn("filename", regexp_extract(col("filename"), ".*/(.*)", 1))

这三种方法都能帮你得到想要的结果:

+--------------+----------+-----------------+
|co_tipo_arquiv|filename  |count_tipo_arquiv|
+--------------+----------+-----------------+
|05            |files_01  |2                |
|01            |files_02  |2                |
+--------------+----------+-----------------+

内容的提问来源于stack exchange,提问作者Leonardo Gusmão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:07:30