gpt4 book ai didi

java - 使用 sc.textFile 从子目录递归获取文件内容

转载 作者:IT老高 更新时间:2023-10-28 20:57:44 33 4
gpt4 key购买 nike

SparkContext textFile 似乎只希望文件出现在给定的目录位置 - 它也没有

  • (a) 递归或
  • (b) 甚至 support 目录(尝试将目录读取为文件)

关于如何构建递归的任何建议 - 可能比手动创建递归文件列表/下降逻辑更简单?

这是用例:

下的文件

/data/tables/my_table

我希望能够通过 hdfs 调用读取该父目录下所有目录级别的所有文件。

更新

sc.textFile() 通过(子类)TextInputFormat 调用 Hadoop FileInputFormat。内部确实存在执行递归目录读取的逻辑 - 即首先检测条目是否为目录,如果是则降序:

<!-- language: java -->
for (FileStatus globStat: matches) {
218 if (globStat.isDir()) {
219 for(FileStatus stat: fs.listStatus(globStat.getPath(),
220 inputFilter)) {
221 result.add(stat);
222 }
223 } else {
224 result.add(globStat);
225 }
226 }

但是,当调用 sc.textFile 时,目录条目出现错误:“不是文件”。这种行为令人困惑 - 鉴于似乎已经为处理目录提供了适当的支持。

最佳答案

我正在查看旧版本的 FileInputFormat..

之前设置递归配置ma​​preduce.input.fileinputformat.input.dir.recursive

scala> sc.textFile("dev/*").count
java.io.IOException: Not a file: file:/shared/sparkup/dev/audit-release/blank_maven_build

默认值为 null/未设置,评估为“false”:

scala> sc.hadoopConfiguration.get("mapreduce.input.fileinputformat.input.dir.recursive")
res1: String = null

之后:

现在设置值:

sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive","true")

现在重试递归操作:

scala>sc.textFile("dev/*/*").count

..
res5: Long = 3481

So it works.

更新添加了 / 以实现@Ben 的每条评论的完全递归

关于java - 使用 sc.textFile 从子目录递归获取文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28817940/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com