读取具有不同列顺序的文件

Posted

技术标签:

【中文标题】读取具有不同列顺序的文件【英文标题】:Read files with different column order 【发布时间】:2020-08-21 23:38:43 【问题描述】:

我有几个带有标题的 csv 文件,但我发现有些文件有不同的列顺序。有没有办法用 Spark 来处理这个问题,我可以为每个文件定义选择顺序,这样主 DF 就不会出现 col x 可能具有 col y 值的不匹配?

我目前的阅读 -

 val masterDF = spark.read.option("header", "true").csv(allFiles:_*)

【问题讨论】:

【参考方案1】:

提取all file names并存储到列表变量中。

然后定义 schema of 其中的所有列。

iterate通过每个文件使用header true,所以我们分别读取每个文件。

unionAll 新数据框与现有数据框。

Example:

file_lst=['<path1>','<path2>']

from pyspark.sql.functions import *
from pyspark.sql.types import *

#define schema for the required columns
schema = StructType([StructField("column1",StringType(),True),StructField("column2",StringType(),True)])

#create an empty dataframe
df=spark.createDataFrame([],schema)

for i in file_lst:
    tmp_df=spark.read.option("header","true").csv(i).select("column1","column2")
    df=df.unionAll(tmp_df)

#display results
df.show()

【讨论】:

这不是很贵吗?创建 df 然后合并 100K 文件?有没有更好的方法来做到这一点? 我们要在这里指出的一个问题是 unionAll 将累加分区数。最后,当您将输出推送到下游时,您最终会得到小文件,这会降低下游应用程序的性能……确保重新分区并将数据推送到下游。 @Hello.World,如果列名在最新 Spark 版本中的顺序不同,我想不出任何其他选择。

以上是关于读取具有不同列顺序的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中读取具有不同列数的 CSV 文件

读取具有不同列宽但在 R 中固定分隔符的文本文件

Java读取列文件中具有不同数字的txt并将数据存储在arraylist中

是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?

合并具有不同列名但定义相同的多个CSV

附加两个具有相同列、不同顺序的数据框