使用 Spark 将多个文件中的列合并到单个文件中

Posted

技术标签:

【中文标题】使用 Spark 将多个文件中的列合并到单个文件中【英文标题】:Columns from multiple files into single file using Spark 【发布时间】:2020-06-04 10:40:26 【问题描述】:

我正在尝试将文件夹中多个 csv 文件中的数据加载到单个 csv 文件中。所有文件都有不同的架构,但会有一个共同的主键。

文件的示例结构如下

文件1:PK,Col1,Col2,Col3

文件 2:PK、ColD、ColA、ColB、ColC

文件3:PK、A、B、C

最终的文件结构应该是这样的

PK,Col1,Col3,A,ColD,C,ColC

最后,文件将以 Parquet 或 Delta 格式保存。

请就如何使用 Spark、Scala 解决这种情况提出建议

添加一些示例文件内容以便更好地理解。

文件1

emp_id |员工名 |工作名称 | dep_id

68319 |凯灵 |总统 | 1001

66928 |火焰 |经理 | 3001

67832 |克莱尔 |经理 | 1001

65646 |乔纳斯 |经理 | 2001

67858 |猩红 |分析师 | 2001

文件2

emp_id | manager_id |雇用日期

68319 | | 1991-11-18

66928 | 68319 | 1991-05-01

67832 | 68319 | 1991-06-09

65646 | 68319 | 1991-04-02

67858 | 65646 | 1997-04-19

文件3

emp_id |工资

68319 | 6000.00

66928 | 2750.00

67832 | 2550.00

65646 | 2957.00

67858 | 3100.00

最终结果

emp_id |员工名 |工作名称 | manager_id |雇用日期 |工资 | dep_id

68319 |凯灵 |总统 | | 1991-11-18 | 6000.00 | 1001

66928 |火焰 |经理 | 68319 | 1991-05-01 | 2750.00 | 3001

67832 |克莱尔 |经理 | 68319 | 1991-06-09 | 2550.00 | 1001

65646 |乔纳斯 |经理 | 68319 | 1991-04-02 | 2957.00 | 2001

67858 |猩红 |分析师 | 65646 | 1997-04-19 | 3100.00 | 2001

【问题讨论】:

【参考方案1】:
    一口气读完所有文件 仅选择您想要添加到新 DF 中的那些列。
val columns = List("PK","Col1","Col3","A","ColD","C","ColC")
val newDF = spark.read.csv("File1","File2","File3").select(columns.map(col):_*)
newDf.write.parquet("/parquet.file")

【讨论】:

感谢@QuickSilver 的快速回复。但是数据框总是从具有最大列数的文件中获取列名。在附加文件时无法从文件中获取列。

以上是关于使用 Spark 将多个文件中的列合并到单个文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pandas 将多个 csv 文件中的单个数据列合并为一个?

如何将多个 csv 文件合并为单个 csv 文件

Spark - 使用 JSON 文件的许可模式将所有记录移动到损坏的列

在 Linux 中将多个 jpg 合并为单个 pdf

使用 Pandas 将多个日志文件数据导出到单个 Excel

将具有不同架构(列)的多个文件 (.csv) 合并/合并为单个文件 .csv - Azure 数据工厂