读取不同文件夹深度的多个 csv 文件
Reading multiple csv files at different folder depths
如果可能,我想使用单个路径将给定文件夹中的所有 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()
也接受多个字符串作为路径参数,但希望尽可能避免这种情况。
注意: 我知道我的问题与 类似,只是我想包含 所有包含文件夹的文件 , 与它们在主文件夹中的位置无关。
如果您的 resources
目录中只有 csv 文件并且只有一级子文件夹,那么您可以使用 resources/**
.
编辑
否则您可以使用 Hadoop FileSystem
class 递归列出 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/")
如果可能,我想使用单个路径将给定文件夹中的所有 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()
也接受多个字符串作为路径参数,但希望尽可能避免这种情况。
注意: 我知道我的问题与
如果您的 resources
目录中只有 csv 文件并且只有一级子文件夹,那么您可以使用 resources/**
.
编辑
否则您可以使用 Hadoop FileSystem
class 递归列出 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/")