从Spark中的多个文件夹加载多个文件

时间:2020-04-15 02:48:34

标签: scala apache-spark

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

1 个答案:

答案 0 :(得分:4)

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

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|
//+----+---+------+---------------------------+