请求修改Azure Databricks Scala代码以递归遍历子文件夹生成DataFrame
递归遍历文件夹生成文件列表DataFrame的Scala实现
以下是修改后的代码,支持递归遍历指定路径下的所有子文件夹,将所有文件的属性汇总到同一个DataFrame中:
import org.apache.spark.sql.DataFrame def GetFiles(path: String): DataFrame = { try { // 获取当前路径下的所有文件和文件夹 val items = dbutils.fs.ls(path) // 分离当前路径下的文件和文件夹 val (files, folders) = items.partition(!_.isDir) // 将当前文件转换为DataFrame val currentFilesDF = spark.createDataFrame( files.map { info => (info.path, info.name, info.size, info.modificationTime) } ).toDF("path", "name", "size", "modificationTime") // 递归遍历所有子文件夹,收集子文件夹的文件DataFrame val subFolderDFs = folders.map(folder => GetFiles(folder.path)) // 合并当前文件DataFrame和所有子文件夹的DataFrame val allFilesDF = subFolderDFs.foldLeft(currentFilesDF)(_.union(_)) // 按文件名排序返回 allFilesDF.orderBy("name") } catch { case e: Exception => // 捕获异常并返回空DataFrame spark.emptyDataFrame } }
关键修改点说明:
- 使用
partition(!_.isDir)区分当前路径下的文件和文件夹,通过isDir属性判断对象类型 - 对每个子文件夹递归调用
GetFiles方法,收集所有子层级的文件DataFrame - 通过
foldLeft结合union操作合并所有DataFrame,实现全路径文件汇总 - 保留原有的异常处理逻辑,遇到错误时返回空DataFrame
内容的提问来源于stack exchange,提问作者Diego Eick Moreira
相关产品推荐
相关产品推荐

