如果我们的文件夹folder
包含所有.txt
个文件,我们可以使用sc.textFile("folder/*.txt")
全部阅读这些文件。但是,如果我的文件夹folder
包含更多名为datewise的文件夹,例如03
,04
,...,还包含一些.log
文件,该怎么办?我如何在Spark中阅读这些内容?
在我的情况下,结构更加嵌套&复杂,所以一般的答案是首选。
答案 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")