如何从嵌套子文件夹动态加载多国家道路与铁路数据至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
相关产品推荐
相关产品推荐

