如何在Databricks文件系统中递归移动非空文件并保留目录层级
在Databricks中用Python/Scala实现非空文件递归移动并保留目录层级
需求:在Databricks文件系统中,将所有非空文件(非0字节文件)递归移动至目标文件夹,同时保留目录层级。
示例:
folder_path/ 1/ 2/ file1.json - 0 byte file2.json - 128 kb 3/ 4/ file3.json - 0 byte file4.json - 20 kb outputs: folder_path/ 1/ 2/ file2.json - 128 kb 3/ 4/ file4.json - 20 kb目前可通过Shell脚本与AWK实现,但Databricks不支持AWK,请问能否在Databricks Notebook中用Python或Scala实现该功能?
Python 实现方案
利用Databricks内置的dbutils.fs工具操作文件系统,递归遍历源目录筛选非空文件,按原层级复制到目标目录后删除原文件,实现移动效果。
source_dir = "dbfs:/path/to/source" # 支持dbfs:/或/dbfs/两种路径格式 target_dir = "dbfs:/path/to/target" def move_non_empty_files(source, target): # 列出当前目录下所有条目 entries = dbutils.fs.ls(source) for entry in entries: if entry.isDir(): # 递归处理子目录,先创建对应目标子目录 sub_target = f"{target}/{entry.name}" dbutils.fs.mkdirs(sub_target) move_non_empty_files(entry.path, sub_target) else: # 仅处理大小大于0的非空文件 if entry.size > 0: target_file_path = f"{target}/{entry.name}" # 复制文件到目标路径 dbutils.fs.cp(entry.path, target_file_path, recurse=False) # 删除原文件完成移动 dbutils.fs.rm(entry.path) # 执行移动操作 move_non_empty_files(source_dir, target_dir)
关键说明
dbutils.fs.ls()返回的条目包含path(文件/目录路径)、name(名称)、size(字节数)、isDir()(是否为目录)属性,可直接用于判断和操作。- 递归逻辑保证目标目录层级与源目录完全一致。
- 若需保留原文件,只需移除
dbutils.fs.rm(entry.path)代码行。
Scala 实现方案
逻辑与Python版本一致,使用Scala语法实现递归遍历与文件移动。
val sourceDir = "dbfs:/path/to/source" val targetDir = "dbfs:/path/to/target" def moveNonEmptyFiles(source: String, target: String): Unit = { val entries = dbutils.fs.ls(source) entries.foreach { entry => if (entry.isDir) { val subTarget = s"$target/${entry.name}" dbutils.fs.mkdirs(subTarget) moveNonEmptyFiles(entry.path, subTarget) } else { if (entry.size > 0) { val targetFilePath = s"$target/${entry.name}" dbutils.fs.cp(entry.path, targetFilePath, recurse = false) dbutils.fs.rm(entry.path) } } } } // 执行移动操作 moveNonEmptyFiles(sourceDir, targetDir)
关键说明
- Scala版本的
dbutils.fs.ls()返回FileInfo对象,包含与Python版本对应的属性。 - 语法差异仅体现在循环、字符串拼接等细节,核心逻辑完全一致。
注意事项
- 路径格式:推荐使用
dbfs:/开头的标准格式,也支持/dbfs/的本地挂载路径格式。 - 权限检查:确保运行Notebook的用户对源目录有读权限,对目标目录有写权限。
- 性能优化:若处理大规模文件,可考虑添加批量操作逻辑,但小体量场景下递归方案足够高效。
内容的提问来源于stack exchange,提问作者user3428526
相关产品推荐
相关产品推荐

