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
相关产品推荐
相关产品推荐

