Spark读取多个CSV文件,每个文件一个分区

Spark读取多个CSV文件,每个文件一个分区,csv,apache-spark,apache-spark-sql,Csv,Apache Spark,Apache Spark Sql,假设我在同一个目录中有多个CSV文件,这些文件都共享相同的模式 /tmp/data/myfile1.csv、/tmp/data/myfile2.csv、/tmp/data.myfile3.csv、/tmp/datamyfile4.csv 我希望将这些文件读入Spark数据帧或RDD,并且希望每个文件都是数据帧的一部分。我怎样才能做到这一点?我可以想到两个选择: 1)使用输入文件名 不要试图直接控制分区,而是将输入文件的名称添加到数据帧中,并将其用于需要执行的任何分组/聚合操作。这可能是您最好的选

假设我在同一个目录中有多个CSV文件,这些文件都共享相同的模式

/tmp/data/myfile1.csv、/tmp/data/myfile2.csv、/tmp/data.myfile3.csv、/tmp/datamyfile4.csv


我希望将这些文件读入Spark数据帧或RDD,并且希望每个文件都是数据帧的一部分。我怎样才能做到这一点?

我可以想到两个选择:

1)使用输入文件名

不要试图直接控制分区,而是将输入文件的名称添加到数据帧中,并将其用于需要执行的任何分组/聚合操作。这可能是您最好的选择,因为它更符合spark的并行处理意图,您可以告诉它要做什么,并让它知道如何做。您可以使用如下代码执行此操作:

SQL:

或Python:

from pyspark.sql.functions import input_file_name

newDf = df.withColumn("filename", input_file_name())
2)Gzip您的CSV文件


Gzip不是可拆分的压缩格式。这意味着加载Gzip文件时,每个文件都将是它自己的分区。

有没有办法将每个CSV文件分别读取到分区中?在我的用例中,我想利用这一点,为每个分区生成一个行号,因为在我的输入CSV文件中没有排序列。
from pyspark.sql.functions import input_file_name

newDf = df.withColumn("filename", input_file_name())