Pyspark在ADLS中迭代移动多part文件仅成功1个的问题求解
问题根因
- 核心触发原因为目标路径缺少末尾目录分隔符:若你的
Target_Path是存放文件的目录,末尾未添加/时,第一次移动操作会直接将文件写入为名为Target_Path的单个文件,后续所有移动操作都会因目标路径冲突执行失败,最终仅保留1个移动成功的文件。 - 其次排查拼写错误:示例代码中源路径写为
Soure_Path(缺失字母c),若实际运行代码未修正该拼写,会导致读取的源文件列表数量异常。 - 其他排查方向:ADLS目标路径无写入权限、路径未携带ADLS协议头(如
abfss://、adls://)导致路径解析失败。
修复后代码
import os cnt = 0 # 替换为你实际的源路径 source_path = "Source_Path" # 目标路径末尾必须加/ 标识为目录 target_dir = "Target_Path/" file_list = [file.path for file in dbutils.fs.ls(source_path) if os.path.basename(file.path).startswith("part-")] # 调试用:确认读取到的文件数量符合预期 print(f"待移动文件数量:{len(file_list)}") for i in file_list: cnt += 1 target_full_path = f"{target_dir}Filename_{cnt}.csv" # 第三个参数为True表示允许覆盖已存在的文件,避免重复运行时报错 dbutils.fs.mv(i, target_full_path, True)
额外注意事项
- 若仍存在文件移动失败的情况,可在循环中添加打印语句,输出每次移动的源路径和目标路径,定位具体失败的文件
- 涉及ADLS的路径建议使用完整绝对路径,携带存储账户、容器的协议前缀,避免相对路径解析异常
- 批量移动大量文件时,可添加异常捕获逻辑,避免单个文件移动失败中断整个流程
内容的提问来源于stack exchange,提问作者Cooldbguy
相关产品推荐
相关产品推荐

