基于列合并两个Spark数据帧

时间:2018-12-20 16:00:58

标签: python apache-spark pyspark databricks

我有2个数据框,需要根据一个列(员工代码)进行合并。请注意,数据框大约有75列,因此我提供了一个样本数据集,以获取一些建议/样本解决方案。我正在使用数据块,并且从S3中读取了数据集。

以下是我的两个数据框:

DATAFRAME - 1

|-----------------------------------------------------------------------------------|
|EMP_CODE   |COLUMN1|COLUMN2|COLUMN3|COLUMN4|COLUMN5|COLUMN6|COLUMN7|COLUMN8|COLUMN9|
|-----------------------------------------------------------------------------------|
|A10001     |   B   |       |       |       |       |       |       |       |       |
|-----------------------------------------------------------------------------------|


DATAFRAME - 2
|-----------------------------------------------------------------------------------|
|EMP_CODE   |COLUMN1|COLUMN2|COLUMN3|COLUMN4|COLUMN5|COLUMN6|COLUMN7|COLUMN8|COLUMN9|
|-----------------------------------------------------------------------------------|
|A10001     |       |       |       |       |   C   |       |       |       |       |   
|B10001     |       |       |       |       |       |       |       |       |T2     |
|A10001     |       |       |       |       |       |       |       |   B   |       |
|A10001     |       |       |   C   |       |       |       |       |       |       |
|C10001     |       |       |       |       |       |   C   |       |       |       |
|-----------------------------------------------------------------------------------|   

我需要基于EMP_CODE合并2个数据帧,基本上基于emp_code将dataframe1与dataframe2连接起来。加入联接时,我会得到重复的列,并且正在寻求帮助。

预期的最终数据帧:

|-----------------------------------------------------------------------------------|
|EMP_CODE   |COLUMN1|COLUMN2|COLUMN3|COLUMN4|COLUMN5|COLUMN6|COLUMN7|COLUMN8|COLUMN9|
|-----------------------------------------------------------------------------------|
|A10001     |   B   |       |   C   |       |   C   |       |       |   B   |       |   
|B10001     |       |       |       |       |       |       |       |       |T2     |
|C10001     |       |       |       |       |       |   C   |       |       |       |
|-----------------------------------------------------------------------------------|       

在数据帧1中有3行,其emp_code为A10001,在数据帧2中有1行。所有数据应合并为一条记录,而没有任何重复的列。

非常感谢

5 个答案:

答案 0 :(得分:1)

如果两个df都有连接键的某些列名称,则可以使用以下代码

df1.join(df2, "EMP_CODE")

答案 1 :(得分:1)

您可以使用内部联接

output = df1.join(df2,['EMP_CODE'],how='inner')

您还可以在末尾应用“ distinct”来删除重复项。

output = df1.join(df2,['EMP_CODE'],how='inner').distinct()

答案 2 :(得分:0)

首先,您需要汇总各个数据框。

from pyspark.sql import functions as F
df1 = df1.groupBy('EMP_CODE').agg(F.concat_ws(" ", F.collect_list(df1.COLUMN1)))

您必须为所有列和所有数据框编写此代码。 然后,您必须在所有数据帧上使用联合函数。

df1.union(df2)

,然后在该联合数据帧上重复相同的聚合。

答案 3 :(得分:0)

如果两个数据框的列相同,则可以在scala中完成

output = df1.union(df2)

答案 4 :(得分:0)

您需要的是工会。

如果两个数据框的列数相同,并且要进行“联合”的列在位置上相同(如您的示例中所示),这将起作用:

output = df1.union(df2).dropDuplicates()

如果两个数据框具有相同数量的列,并且需要“联合”的列具有相同的名称(如您的示例中所示),那会更好:

output = df1.unionByName(df2).dropDuplicates()