Scala 使用Spark在hdfs中递归搜索所有文件名
我一直在寻找一种在Hadoop文件系统(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的文件系统
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个月了,但没有答案,这就是我回答的原因。如果你没事,请注意