如何将Databricks递归列Azure存储文件的Python代码转为Scala
Databricks 递归列出文件的Scala等效实现
正确可运行代码
函数定义:
// 导入FileInfo类型,也可直接写全类名避免导入 import com.databricks.backend.daemon.dbutils.FileInfo def deepLs(path: String): Iterator[FileInfo] = { // 遍历当前路径下所有条目,用flatMap合并递归返回的结果 dbutils.fs.ls(path).iterator.flatMap { entry => if (entry.path.endsWith("/")) { // 文件夹:递归遍历子路径 deepLs(entry.path) } else { // 文件:直接返回当前条目 Iterator.single(entry) } } }
调用方法和原Python逻辑完全对应:
// 遍历指定路径下所有嵌套文件,转成List存储 val files = deepLs("srcpath/2021/06/16/").toList // 打印所有文件名 files.foreach(entry => println(entry.name))
原有代码错误说明
你之前编写的代码触发报错的核心原因如下:
- Scala无法自动推导递归函数的返回值类型,递归函数必须显式声明返回类型
- Python的
yield是生成器语法,用于逐个产出元素,而Scala的return会直接终止整个函数执行、返回单个值,和预期返回所有文件集合的逻辑完全不符 - 取路径最后一个字符的逻辑不规范:
x.path(-1)实际返回Char类型字符,不仅会导致类型匹配错误,路径为空时还会触发索引越界,用endsWith("/")判断文件夹更稳妥 - 手动指定的返回类型为String,和实际要返回的
FileInfo集合类型不匹配,触发类型不兼容报错
内容的提问来源于stack exchange,提问作者SanjanaSanju
相关产品推荐
相关产品推荐

