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

Spark 2.3:无需星号读取子目录及多级子目录通用处理

如何让Spark适配任意层级的子目录读取?

这个问题我之前处理过好几次,其实Spark依赖的Hadoop文件系统早就提供了解决方案,给你两个最实用的方法:

方法一:使用**双通配符

Hadoop的文件路径通配规则里,单*只能匹配当前层级的文件或子目录,而**可以匹配任意层级的子目录及其中的文件。把你的路径修改成这样就行:

String folder = "/Users/test/data/**";
sparkContext.textFile(folder, 1).toJavaRDD();

不管你的子目录是2级、10级还是更深的层级,所有子目录下的文本文件都会被自动读取,完全不用关心层级数量。

方法二:开启递归文件查找配置

如果你觉得写通配符不够直观,还可以通过Spark配置开启递归查找功能,这样直接读取根目录就能自动遍历所有子层级:

// 初始化Spark配置时开启递归查找
SparkConf conf = new SparkConf()
    .setAppName("RecursiveFileReader")
    .set("spark.sql.sources.recursiveFileLookup.enabled", "true");
JavaSparkContext sparkContext = new JavaSparkContext(conf);

// 直接读取根目录,无需额外通配符
String folder = "/Users/test/data/";
sparkContext.textFile(folder, 1).toJavaRDD();

这个配置从Spark 2.4版本开始支持,开启后不仅RDD的textFile会递归读取,Spark SQL的read.text等API也会生效,非常适合需要直观路径的场景。

额外注意事项

  • 确保目标路径下的文件都是文本格式,否则textFile会抛出解析错误;如果存在非文本文件,可以考虑用wholeTextFiles读取后过滤文件名,或者提前清理非目标文件。
  • 如果你使用的Spark版本低于2.4,只能选择**通配符的方法,因为递归查找配置是2.4版本才引入的。

内容的提问来源于stack exchange,提问作者Molay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:39:55