使用 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 文件中的单个数据列合并为一个?
Spark - 使用 JSON 文件的许可模式将所有记录移动到损坏的列