如果可能的话,我希望使用单个路径以递归方式将给定文件夹中的所有csv文件读入Spark SQL DataFrame
。
我的文件夹结构看起来像这样,我希望用一条路径包含所有文件:
resources/first.csv
resources/subfolder/second.csv
resources/subfolder/third.csv
这是我的代码:
def read: DataFrame =
sparkSession
.read
.option("header", "true")
.option("inferSchema", "true")
.option("charset", "UTF-8")
.csv(path)
将path
设为.../resource/*/*.csv
省略1.而.../resource/*.csv
省略2.和3.
我知道csv()
也会将多个字符串作为路径参数,但如果可能,请避免使用它。
注意:我知道我的问题类似于How to import multiple csv files in a single load?,但我想要包含所有包含文件夹的文件,而不是它们在主文件夹。
答案 0 :(得分:9)
如果resources
目录中只有csv文件且只有一个级别的子文件夹,那么您可以使用resources/**
。
修改强>
否则,您可以使用Hadoop FileSystem
类递归列出resources
目录中的每个csv文件,然后将列表传递给.csv()
val fs = FileSystem.get(new Configuration())
val files = fs.listFiles(new Path("resources/", true))
val filePaths = new ListBuffer[String]
while (files.hasNext()) {
val file = files.next()
filePaths += file.getPath.toString
}
val df: DataFrame = spark
.read
.options(...)
.csv(filePaths: _*)
答案 1 :(得分:0)
您现在可以在 spark3 中使用 RecursiveFileLookup。
val recursiveLoadedDF = spark.read
.option("recursiveFileLookup", "true")
.csv("resources/")