我一直在寻找一种方法来获取hadoop文件系统(hdfs)中一个目录及其子目录中的所有文件名。
我发现我可以用这些命令来获得它:
sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive", "true")
sc.wholeTextFiles(path).map(_._1)
以下是“wholetextfiles”文档:
从hdfs、本地文件系统(在所有节点上都可用)或任何hadoop支持的文件系统uri读取文本文件目录。每个文件作为单个记录读取,并以键-值对的形式返回,其中键是每个文件的路径,值是每个文件的内容。
参数:
路径-输入数据文件的目录,路径可以用逗号分隔的路径作为输入列表。
minpartitions—输入数据的最小分割数的建议值。
退货:
rdd表示文件路径的元组和相应的文件内容
注意:首选小文件,也允许使用大文件,但可能会导致性能下降。在某些文件系统上,…/path/*是读取目录中所有文件的更有效方法,而不是…/path/或…/path,分区由数据位置决定。默认情况下,这可能导致分区太少。
如您所见,“wholetextfiles”返回一对rdd,其中包含文件名及其内容。所以我试着Map它,只取文件名,但我怀疑它仍然读取文件。
我怀疑的原因是:如果我尝试计数(例如),我得到的Spark相当于“内存不足”(失去执行者,无法完成任务)。
我宁愿用spark以最快的方式来实现这个目标,但是,如果有其他的方式有合理的表现,我很乐意尝试一下。
编辑:要清除它-我想用Spark,我知道我可以使用hdfs命令和类似的东西来做这件事-我想知道如何使用spark提供的现有工具来做这件事,也许还可以解释一下如何让“wholetextfiles”不读取文本本身(有点像转换只在一个动作之后发生,而一些“命令”从未真正发生)。
非常感谢你!
1条答案
按热度按时间z4iuyo4d1#
这是列出所有文件的方法,直到最后一个子目录的深度…并且不使用out
wholetextfiles
并且是递归调用直到子目录的深度。。。就这样。它得到了成功的检验。你可以按原样使用。。