You need to enable JavaScript to run this app. PySpark DataFrame如何拆分完整文件路径为各级父级绝对路径多行
优惠活动
大模型
产品
解决方案
定价
更多

PySpark DataFrame如何拆分完整文件路径为各级父级绝对路径多行

PySpark 实现单文件路径拆分层级多行的方法

实现思路

  • 将原始路径按/分隔符拆分为元素数组
  • 生成从1到数组长度的序列,对应需要截取的路径层级数
  • 炸开序列生成多行,逐行截取对应层级的路径片段拼接
  • 对非文件的文件夹层级追加尾部/,匹配预期输出格式

完整可运行代码

from pyspark.sql import SparkSession
from pyspark.sql import functions as F

# 初始化Spark会话
spark = SparkSession.builder.appName("PathSplit").getOrCreate()

# 构造输入DataFrame,包含给定的完整文件路径
input_df = spark.createDataFrame(
    [("ParentFolder/Folder1/Folder2/Folder3/Folder4/TestFile.txt",)],
    ["path"]
)

# 核心处理逻辑
processed_df = (
    input_df
    # 拆分路径为数组,同时计算数组长度
    .withColumn("path_arr", F.split(F.col("path"), "/"))
    .withColumn("path_len", F.size(F.col("path_arr")))
    # 生成1到路径长度的序列,对应需要截取的层级数
    .withColumn("n_list", F.sequence(F.lit(1), F.col("path_len")))
    # 炸开序列为多行
    .withColumn("n", F.explode(F.col("n_list")))
    # 截取对应层级的路径片段,用/拼接
    .withColumn("raw_path", F.concat_ws("/", F.slice(F.col("path_arr"), 1, F.col("n"))))
    # 非最后一层(文件夹层级)追加尾部/
    .withColumn("processed_path", 
                F.when(F.col("n") < F.col("path_len"), 
                       F.concat(F.col("raw_path"), F.lit("/")))
                .otherwise(F.col("raw_path"))
    )
    # 只保留需要的输出列
    .select("processed_path")
)

# 输出结果验证
processed_df.show(truncate=False)

输出结果

运行上述代码得到的输出完全匹配预期:

+----------------------------------------------------------------+
|processed_path                                                  |
+----------------------------------------------------------------+
|ParentFolder/                                                   |
|ParentFolder/Folder1/                                           |
|ParentFolder/Folder1/Folder2/                                  |
|ParentFolder/Folder1/Folder2/Folder3/                           |
|ParentFolder/Folder1/Folder2/Folder3/Folder4/                   |
|ParentFolder/Folder1/Folder2/Folder3/Folder4/TestFile.txt     |
+----------------------------------------------------------------+

适配说明

  • 如果输入路径为开头带/的绝对路径,只需在split后过滤数组第一个空元素,后续逻辑无需改动
  • 若存在Windows风格的\分隔符,将split的分隔符替换为\\\\即可适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 16:57:03