Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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

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 使用Spark在hdfs中递归搜索所有文件名_Scala_Apache Spark_Hadoop - Fatal编程技术网

Scala 使用Spark在hdfs中递归搜索所有文件名

Scala 使用Spark在hdfs中递归搜索所有文件名,scala,apache-spark,hadoop,Scala,Apache Spark,Hadoop,我一直在寻找一种在Hadoop文件系统(hdfs)中获取目录及其子目录中所有文件名的方法 我发现我可以使用以下命令来获得它: sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive", "true") sc.wholeTextFiles(path).map(_._1) 以下是“wholeTextFiles”文档: 从HDFS、本地文件系统(可在所有节点上使用)或任何支持Hadoop的文件系统

我一直在寻找一种在Hadoop文件系统(hdfs)中获取目录及其子目录中所有文件名的方法

我发现我可以使用以下命令来获得它:

sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive", "true")
sc.wholeTextFiles(path).map(_._1)
以下是“wholeTextFiles”文档:

从HDFS、本地文件系统(可在所有节点上使用)或任何支持Hadoop的文件系统URI读取文本文件目录。每个文件作为单个记录读取,并以键-值对的形式返回,其中键是每个文件的路径,值是每个文件的内容

参数:

路径-输入数据文件的目录,路径可以是 以逗号分隔的路径作为输入列表

Mina-A 输入数据的最小分割数的建议值

返回:

RDD表示文件路径的元组和相应的 文件内容

注意:小文件优先,大文件也优先 允许,但可能会导致性能下降。在某些文件系统上, …/path/*是一种更有效的方法,可以在同一时间内读取所有文件 目录而不是…/path/或…/path,分区是 由数据位置确定。这可能会导致分区太少 默认

如您所见,“wholeTextFiles”返回一对RDD,其中包含文件名及其内容。所以我试着映射它,只取文件名,但我怀疑它仍然读取文件

我怀疑的原因是:如果我尝试计数(例如),我得到的火花相当于“内存不足”(失去执行器,无法完成任务)

我宁愿使用Spark以最快的方式实现这一目标,但是,如果有其他性能合理的方式,我很乐意尝试一下

编辑: 为了澄清这一点,我想使用Spark,我知道我可以使用HDFS命令等等,我想知道如何使用Spark提供的现有工具来完成这一点,也许还需要解释一下如何使“wholeTextFiles”不阅读文本本身(有点像转换只在动作之后发生,而一些“命令”从未真正发生)

非常感谢!

这是一种列出所有文件直到最后一个子目录深度的方法……并且使用
wholetextfiles
并且是递归调用,直到子目录的深度

val lb = new scala.collection.mutable[String] // variable to hold final list of files
def getAllFiles(path:String, sc: SparkContext):scala.collection.mutable.ListBuffer[String] = {
 val conf = sc.hadoopConfiguration
 val fs = FileSystem.get(conf)
 val files: RemoteIterator[LocatedFileStatus] = fs.listLocatedStatus(new Path(path))
 while(files.hasNext) {// if subdirectories exist then has next is true
  var filepath = files.next.getPath.toString
  //println(filepath)
  lb += (filepath)
  getAllFiles(filepath, sc) // recursive call
 }
 println(lb)
 lb
}

就是这样。它经过了成功的测试。您可以按原样使用。

可能重复的谢谢,但它不是重复的,我需要使用Spark或最起码的scala。无论如何,谢谢!这不是真正的Spark任务,因为Spark是一个处理大量数据的框架,而您只想读取HDFS元数据。正如您所识别的d、 您使用的任何Spark方法都将尝试读取任何提供的文件的内容。因此,您将使用HDFS API来实现这一点。链接的公认答案是您应该查看的地方。此外,这是一个简短的教程(不是我的)这演示了如何通过Scala与HDFS交互。我想这是我能得到的最好的解决方案,谢谢你的解决方案!它已经4个月了,但没有答案,这就是我回答的原因。如果你没事,请注意