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
相关产品推荐
相关产品推荐

