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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:20:32