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

