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

mmn*_*yle 6 csv apache-spark apache-spark-sql

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

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

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

Rya*_*ier 3

我能想到的你有两个选择:

1) 使用输入文件名

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

SQL:

SELECT input_file_name() as fname FROM dataframe
Run Code Online (Sandbox Code Playgroud)

或者Python:

from pyspark.sql.functions import input_file_name

newDf = df.withColumn("filename", input_file_name())
Run Code Online (Sandbox Code Playgroud)

2) 对 CSV 文件进行 Gzip 压缩

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