使用Scala列出给定HDFS路径到一定深度的所有子目录?
我有各种各样的Spark项目,它们只以几个分区格式以HDFS编写数据。 例如: 格式1:使用Scala列出给定HDFS路径到一定深度的所有子目录?,scala,apache-spark,hadoop,hdfs,Scala,Apache Spark,Hadoop,Hdfs,我有各种各样的Spark项目,它们只以几个分区格式以HDFS编写数据。 例如: 格式1: /tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=x/dir4=y/second_id=4567 /tmp/myProject3/dir1/dir2/parquet/first_id=9912/dir3=x/second_id=1129 格式2: /tmp/myProject2/dir1/dir2/parquet/first_id=3212/sec
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=x/dir4=y/second_id=4567
/tmp/myProject3/dir1/dir2/parquet/first_id=9912/dir3=x/second_id=1129
格式2:
/tmp/myProject2/dir1/dir2/parquet/first_id=3212/second_id=9129
格式3:
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=x/dir4=y/second_id=4567
/tmp/myProject3/dir1/dir2/parquet/first_id=9912/dir3=x/second_id=1129
我的问题是给出一个基本路径,即/tmp//dir1/dir2/parquet
,动态构建这些路径到second\u id的最简单方法是什么
注意:我不希望使用通配符,而是希望在给定任何基本路径的情况下,动态获取所有这些路径的列表,直到second\u id
。我无法找到一种足够灵活的方法,在给定任何基本路径作为参数的情况下,创建一个高达second\u id
的路径列表
到目前为止,我尝试的是:
val fs = FileSystem.get(new Configuration())
val status = fs.listStatus(new Path("/tmp/myProject1/dir1/dir2/parquet/first_id=1234/"))
status.foreach(x=> println(x.getPath))
这只需打印到级别1:
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=x
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=a
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=c
相反,我希望它列出第二个_id之前的所有文件,例如:
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=x/dir4=y/second_id=4567
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=a/dir4=z/second_id=1231
/tmp/myProject1/dir1/dir2/parquet/first_id=1234/dir3=c/dir4=k/second_id=4123
同样,对于其他两种格式,它应该列出所有文件,直到第二个id。有可能的解决方案吗?我对HDFS和Scala还很陌生
给定一个基本路径,即/tmp//dir1/dir2/parquet
,动态构建这些路径到秒id
的最简单方法是什么
Hadoop FS API中没有这样的选项。对于文件,可以使用方法递归列出文件,但不能控制最大深度
对于目录,可以使用如下自定义递归函数:
import org.apache.hadoop.fs._
def listDirectories(baseFolder: Path, depth: Integer = 0, maxDepth: Integer = -1): Seq[Path] = {
val fs = FileSystem.get(sc.hadoopConfiguration)
val ls = fs.listStatus(baseFolder)
ls.filter(_.isDir).flatMap { s =>
maxDepth match {
case m if (m == -1 || depth < m) => listDirectories(s.getPath, depth + 1, maxDepth)
case _ => Seq(s.getPath)
}
}
}
这似乎没有列出任何东西。我已经导入了所有相关的包,但这并没有真正显示任何内容。你能检查一下吗@Blackishoplook认为maxDepth=-1的第二个_id案例存在问题,如果我指定maxDepth,它可以正常工作。