读取不同文件夹深度的多个 csv 文件



如果可能的话,我想使用单个路径将给定文件夹中的所有 csv 文件递归读取到 Spark SQL DataFrame中。

我的文件夹结构如下所示,我想通过一个路径包含所有文件:

  1. resources/first.csv
  2. resources/subfolder/second.csv
  3. 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()也将多个字符串作为路径参数,但如果可能的话,希望避免这种情况。

注意:我知道我的问题类似于如何在一次加载中导入多个csv文件?,除了我想包含所有包含文件夹的文件,而与它们在主文件夹中的位置无关。

如果您的 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: _*)

现在可以在 spark3 中使用RecursiveFileLookup

val recursiveLoadedDF = spark.read
  .option("recursiveFileLookup", "true")
  .csv("resources/")

更多参考:递归文件查找

最新更新