Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Scala列出给定HDFS路径到一定深度的所有子目录?_Scala_Apache Spark_Hadoop_Hdfs - Fatal编程技术网

使用Scala列出给定HDFS路径到一定深度的所有子目录?

使用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

我有各种各样的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/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,它可以正常工作。