【问题标题】:Load multiple files from multiple folders in spark从 Spark 中的多个文件夹加载多个文件
【发布时间】:2020-07-27 22:30:39
【问题描述】:

我有一个数据集,其中包含主文件夹内的多个文件夹,每个文件夹包含多个 CSV 文件。每个 CSV 文件都有名为 X、Y 和 Z 的三列。我想创建一个数据框,以便数据框的前三列是三个 X、Y、Z。我想要另外两列,这样第四列包含从中读取 CSV 文件的文件夹的名称。第五列包含 CSV 文件的名称。如何在 Scala 和 Spark 中创建此数据框?

【问题讨论】:

  • 你尝试了什么?如何从 CSV 加载在 Spark 文档中。重新整理文件名列,.withColumn("filename", input_file_name) 是要走的路。如何从中取出目录在 Scala 中是显而易见的。非常好的 Spark 文档中解释了所有内容。或者,您也可以使用wholeTextFiles,然后手动创建数据框

标签: scala apache-spark


【解决方案1】:

您可以使用 spark.read.csv 然后使用 input_file_name 获取文件名并从文件名中提取 directory

Example:

1.extracting directory from filename:

// Lets take we have directory `tmp2` with folders having csv files in it
tmp2
|-folder1
|-folder2

//extracting directory from filename

spark.read.option("header",true).
csv("tmp2/*").
withColumn("file_name",input_file_name).
withColumn("directory",element_at(reverse(split(col("file_name"),"/")),2)).
show()

//+----+---+---------------------------+---------+
//|name|id |file_name                  |directory|
//+----+---+---------------------------+---------+
//|2   |b  |file:///tmp2/folder2/t1.csv|folder2  |
//|1   |a  |file:///tmp2/folder1/t.csv |folder1  |
//+----+---+---------------------------+---------+

2. Get folder name while reading file:

如果您有像 folder=<val> 这样的文件夹结构,则 spark 会将文件夹读取为分区列,并将 folder 添加为分区列。

//folder structure

tmp3
|-folder=1
|-folder=2

spark.read.
option("header",true).
csv("tmp3").\
withColumn("file_name",input_file_name).
show(false)

//+----+---+------+---------------------------+
//|name|id |folder|file_name                  |
//+----+---+------+---------------------------+
//|a   |1  |2     |file:///tmp3/folder=2/t.txt|
//|a   |1  |1     |file:///tmp3/folder=1/t.txt|
//+----+---+------+---------------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多