【问题标题】:Reading multiple csv files at different folder depths读取不同文件夹深度的多个 csv 文件
【发布时间】:2017-08-20 00:09:33
【问题描述】:

如果可能,我想使用单个路径将给定文件夹中的所有 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() 也接受多个字符串作为路径参数,但如果可能的话希望避免这种情况。

注意:我知道我的问题类似于How to import multiple csv files in a single load?,除了我想包含所有包含的文件夹的文件,与它们在主文件夹中的位置无关.

【问题讨论】:

标签: scala csv apache-spark dataframe wildcard


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。是的,只有 csv 文件。不幸的是,resources/** 没有做到这一点:它只检索resources/ 中的文件,但忽略了resources/subfolder 中的文件
  • 我刚刚意识到我暂时搞砸了我的测试场景——你当然是对的,/**确实工作。对困惑感到抱歉。 :)
  • 我对路径的位置有些模糊。我不知道它是在默认的 scala、hadoop、java.io 还是 java.nio 包中。所有都在 Hadoop 包中,包括 Path。您可以使用import org.apache.hadoop.fs.{FileSystem, Path} 导入它们,使用import org.apache.hadoop.conf.Configuration 导入配置。
【解决方案2】:

您现在可以在 spark3 中使用 RecursiveFileLookup。

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

更多参考:recursive-file-lookup

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多