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

如何从嵌套子文件夹动态加载多国家道路与铁路数据至Spark RDD?

动态读取多国家道路/铁路数据生成Spark RDD

方法一:使用Spark路径通配符(最简洁高效)

Spark原生支持路径通配符,直接通过通配符匹配所有符合规则的目录,无需手动枚举国家或子文件夹:

// 替换为你的根目录路径
val rootDir = "/path/to/your/root/directory"

// 读取所有国家下的道路数据,生成统一RDD
val roadRDD = spark.sparkContext.textFile(s"$rootDir/*/*_rds/*")

// 读取所有国家下的铁路数据,生成统一RDD
val railRDD = spark.sparkContext.textFile(s"$rootDir/*/*_rrd/*")
  • 通配符说明:$rootDir/*匹配所有国家目录(如ind、nep),*_rds匹配每个国家下的道路子文件夹,最后的*匹配子文件夹内的所有数据文件。
  • 如果读取的是Shapefile等空间格式,替换textFile为对应空间库的读取方法即可(比如GeoSpark的ShapefileReader.readToRDD),路径匹配逻辑保持一致。

方法二:动态遍历目录(适合复杂校验场景)

如果需要对目录做额外校验(比如过滤特定国家、检查目录权限),可以通过Hadoop文件系统API先收集所有符合条件的路径,再合并生成RDD:

import org.apache.hadoop.fs.{FileSystem, Path}
import scala.collection.JavaConverters._

val rootPath = new Path("/path/to/your/root/directory")
val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)

// 收集所有道路文件夹路径
val roadPaths = fs.listStatus(rootPath)
  .filter(_.isDirectory) // 筛选国家目录
  .flatMap(countryDir => 
    fs.listStatus(countryDir.getPath)
      .filter(status => status.isDirectory && status.getPath.getName.endsWith("_rds"))
      .map(_.getPath.toString)
  )

// 收集所有铁路文件夹路径
val railPaths = fs.listStatus(rootPath)
  .filter(_.isDirectory)
  .flatMap(countryDir => 
    fs.listStatus(countryDir.getPath)
      .filter(status => status.isDirectory && status.getPath.getName.endsWith("_rrd"))
      .map(_.getPath.toString)
  )

// 合并路径生成统一RDD
val roadRDD = spark.sparkContext.textFile(roadPaths.mkString(","))
val railRDD = spark.sparkContext.textFile(railPaths.mkString(","))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:20:33