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

如何让Spark Session递归读取所有文件?多深度目录读取难题求解

优雅解决Spark递归读取不同深度目录下JSON文件的问题

这个场景我太熟悉了,用普通的层级通配符确实很难兼顾所有不同深度的目录,不过Spark其实有现成的方案能一次性搞定递归读取!

先分析下你之前的问题根源

你尝试的几个通配符之所以没法全覆盖,是因为它们都是固定层级匹配:

  • *:只能匹配当前目录下的直接子节点(所以能拿到10thOct_logs1,但拿不到更深的logs2、logs3)
  • */*:匹配一级子目录下的节点(拿到logs2,但漏了logs1和logs3)
  • */*/*:匹配两级子目录下的节点(拿到logs3,但前两个都被排除了)

最优解决方案:使用**递归通配符

Spark支持用**来匹配任意深度的子目录,只需要把路径写成这样:

spark.read.json("file:///var/foo/try/**")

这个路径会自动递归遍历try/下所有层级的目录,不管是直接在try/下的10thOct_logs1,还是两级深度的11thOct/logs2,甚至三级深度的Oct/12th/logs3,都会被一次性匹配到,完美解决你的问题。

额外优化:精准过滤JSON文件

如果你的目录里混有非JSON文件,担心读取出错,可以结合后缀过滤,只读取.json文件:

spark.read.json("file:///var/foo/try/**/*.json")

或者用Spark的pathGlobFilter参数(Spark 2.0及以上版本支持),更灵活地过滤文件:

spark.read.option("pathGlobFilter", "*.json").json("file:///var/foo/try/")

这个参数会让Spark在递归读取目录时,只保留符合后缀的文件,避免无效文件干扰。

另一种简洁方式:直接指定根目录

其实Spark默认就会递归读取指定目录下的所有子目录内容,所以你直接写根目录路径也能实现效果:

spark.read.json("file:///var/foo/try/")

不过这种方式会读取目录下所有类型的文件,如果有非JSON文件存在,可能会导致解析错误,所以更推荐搭配上面的过滤方式一起用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:51