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

时间:2017-03-27 10:21:03

标签: scala csv apache-spark dataframe wildcard

如果可能的话,我希望使用单个路径以递归方式将给定文件夹中的所有csv文件读入Spark SQL DataFrame

我的文件夹结构看起来像这样,我希望用一条路径包含所有文件:

  1. resources/first.csv
  2. resources/subfolder/second.csv
  3. resources/subfolder/third.csv
  4. 这是我的代码:

    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?,但我想要包含所有包含文件夹的文件,而不是它们在主文件夹。

2 个答案:

答案 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/")

更多参考:recursive-file-lookup