读取Spark中嵌套文件夹中的所有文件

时间:2015-08-26 18:01:13

标签: apache-spark

如果我们的文件夹folder包含所有.txt个文件,我们可以使用sc.textFile("folder/*.txt")全部阅读这些文件。但是,如果我的文件夹folder包含更多名为datewise的文件夹,例如0304,...,还包含一些.log文件,该怎么办?我如何在Spark中阅读这些内容?

在我的情况下,结构更加嵌套&复杂,所以一般的答案是首选。

4 个答案:

答案 0 :(得分:15)

如果目录结构是常规的,可以这样说:

folder
├── a
│   ├── a
│   │   └── aa.txt
│   └── b
│       └── ab.txt
└── b
    ├── a
    │   └── ba.txt
    └── b
        └── bb.txt

您可以对每个嵌套级别使用*通配符,如下所示:

>>> sc.wholeTextFiles("/folder/*/*/*.txt").map(lambda x: x[0]).collect()

[u'file:/folder/a/a/aa.txt',
 u'file:/folder/a/b/ab.txt',
 u'file:/folder/b/a/ba.txt',
 u'file:/folder/b/b/bb.txt']

答案 1 :(得分:4)

Spark 3.0提供了 recursiveFileLookup 选项,用于从递归子文件夹中加载文件。

val df= sparkSession.read
       .option("recursiveFileLookup","true")
      .option("header","true")
      .csv("src/main/resources/nested")

这会递归地从src / main / resources / nested及其子文件夹中加载文件。

答案 2 :(得分:2)

如果只想使用以“ a”开头的文件,则可以使用

sc.wholeTextFiles("/folder/a*/*/*.txt") or sc.wholeTextFiles("/folder/a*/a*/*.txt")

也是。我们可以将*用作通配符。

答案 3 :(得分:0)

sc.wholeTextFiles("/directory/201910*/part-*.lzo")获取所有匹配文件名称,而不是文件内容。

如果要加载目录中所有匹配文件的内容,则应使用

sc.textFile("/directory/201910*/part-*.lzo")

并设置读取目录递归!

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

提示:scala与python不同,下面将其设置为scala!

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