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

