如何统计HDFS目录下的文件数量?Scala代码报错求助
问题分析与解决方案
代码中的核心问题
- 未定义
status变量:你引用了status但从未将globStatus的查询结果赋值给它 - 类型不匹配:
fs.globStatus()返回的是Array[FileStatus]数组,不是迭代器,无法用hasNext()/next()方法遍历 - 语法错误:if语句结构不完整,存在多余的闭合大括号,导致代码编译失败
修正后的代码
val hdfspath = "/data/fnl-ecomm/release/*/*/*/schema/*.json" import org.apache.hadoop.fs.{FileSystem, Path, FileStatus} // 获取HDFS文件系统实例 val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration) // 获取匹配的文件状态,过滤出实际文件(排除目录) val fileStatuses: Array[FileStatus] = fs.globStatus(new Path(hdfspath)) .filter(_ != null) // 防御性处理,避免空元素 .filter(_.isFile) // 打印所有匹配的文件路径 fileStatuses.map(_.getPath).foreach(println) // 统计并输出文件数量 val count = fileStatuses.length if (count > 0) { println(s"Count is $count") } else { println("count is zero") }
关键修正说明
- 用
fileStatuses变量接收globStatus的结果,解决未定义变量的问题 - 直接使用数组的
length属性统计文件数量,替代低效的手动循环,更符合Scala的写法 - 修复了if-else的语法结构,确保代码块正确包裹
- 添加防御性过滤
filter(_ != null),避免globStatus返回null元素引发异常 - 使用Scala字符串插值输出统计结果,格式更清晰规范
内容的提问来源于stack exchange,提问作者pavan hudekar
相关产品推荐
相关产品推荐

