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

如何用PySpark在HDFS中复制文件并保留原目录结构

解决HDFS迁移时保留目录结构的问题

核心思路

从原目录路径中提取dt=yyyy.MM.dd这类子目录的相对路径,将其拼接在目标根路径后,确保每个子目录的文件写入对应结构的目标路径中。

修改后的代码示例

# 定义原根路径与目标根路径
source_root = '/user/test/data/data_backlog'
target_root = '/user/test/data/data_backlog_backup'

# 获取待迁移的目录列表
directories = get_list_path(end_date, lake.listStatus(spark._jvm.org.apache.hadoop.fs.Path(source_root)), False)

for _par in directories:
    # 转换为Hadoop Path对象处理路径
    source_path = spark._jvm.org.apache.hadoop.fs.Path(_par)
    # 提取原目录相对于根路径的子目录部分(如dt=2023.01.01)
    relative_path = source_root.relativize(source_path).toString()
    # 构造目标路径:目标根路径 + 相对子目录
    target_path = f"{target_root}/{relative_path}"
    
    # 读取原AVRO文件
    df_bkp = spark.read.format('avro').load(_par)
    # 写入到对应目标路径,保留目录结构
    DataIO.write(df_bkp.coalesce(5), target_path, "overwrite")
    
    # 删除原目录(建议确认写入成功后执行)
    lake.Delete(fs.Path(_par), True)

关键步骤说明

  • 路径解析:借助Hadoop的Path.relativize()方法自动计算相对路径,避免手动字符串切割的误差。
  • 目标路径构造:将相对子目录拼接到目标根路径后,确保日期子目录在目标路径下同步创建。
  • 写入逻辑调整:把原固定的"data_backlog"替换为动态生成的完整目标路径,让Spark写入到对应子目录中。

注意事项

如果你的DataIO.write方法内部基于预设根路径拼接子目录,需修改参数传递逻辑:要么传入完整目标路径,要么传入相对子目录部分,让方法内部拼接目标根路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:10:58