加入两个数据框和结果数据框在 PySpark 中包含不重复的项目?

Posted

技术标签:

【中文标题】加入两个数据框和结果数据框在 PySpark 中包含不重复的项目?【英文标题】:Joining two data frames and result data frames contain non duplicate items in PySpark? 【发布时间】:2018-02-12 07:23:48 【问题描述】:

我通过执行以下命令创建了两个数据框。我想要 加入两个数据框,结果数据框包含 PySpark 中不重复的项目。

df1 = sc.parallelize([
     ("a",1,1),
     ("b",2,2),
     ("d",4,2),
     ("e",4,1),
     ("c",3,4)]).toDF(['SID','SSection','SRank'])
df1.show()
+---+--------+-----+
|SID|SSection|SRank|
+---+--------+-----+
|  a|       1|    1|
|  b|       2|    2|
|  d|       4|    2|
|  e|       4|    1|
|  c|       3|    4|
+---+--------+-----+

df2 是

df2=sc.parallelize([
    ("a",2,1),
    ("b",2,3),
    ("f",4,2),
    ("e",4,1),
    ("c",3,4)]).toDF(['SID','SSection','SRank'])
+---+--------+-----+
|SID|SSection|SRank|
+---+--------+-----+
|  a|       2|    1|
|  b|       2|    3|
|  f|       4|    2|
|  e|       4|    1|
|  c|       3|    4|ggVG
+---+--------+-----+

我想加入上面的两个表,如下所示。

+---+--------+----------+----------+
|SID|SSection|test1SRank|test2SRank|
+---+--------+----------+----------+
|  f|       4|         0|         2|
|  e|       4|         1|         1|
|  d|       4|         2|         0|
|  c|       3|         4|         4|
|  b|       2|         2|         3|
|  a|       1|         1|         0|
|  a|       2|         0|         1|
+---+--------+----------+----------+

【问题讨论】:

【参考方案1】:

看起来不像是通过单个连接就可以实现的。这是一个涉及多个连接的解决方案:

from pyspark.sql.functions import col

d1 = df1.unionAll(df2).select("SID" , "SSection" ).distinct()

t1 = d1.join(df1 , ["SID", "SSection"] , "leftOuter").select(d1.SID , d1.SSection , col("SRank").alias("test1Srank"))

t2 = d1.join(df2 , ["SID", "SSection"] , "leftOuter").select(d1.SID , d1.SSection , col("SRank").alias("test2Srank"))

t1.join(t2, ["SID", "SSection"]).na.fill(0).show()

+---+--------+----------+----------+
|SID|SSection|test1Srank|test2Srank|
+---+--------+----------+----------+
|  b|       2|         2|         3|
|  c|       3|         4|         4|
|  d|       4|         2|         0|
|  e|       4|         1|         1|
|  f|       4|         0|         2|
|  a|       1|         1|         0|
|  a|       2|         0|         1|
+---+--------+----------+----------+

【讨论】:

【参考方案2】:

您可以简单地重命名SRank 列名并使用外连接 并使用na.fill 函数

df1.withColumnRenamed("SRank", "test1SRank").join(df2.withColumnRenamed("SRank", "test2SRank"), ["SID", "SSection"], "outer").na.fill(0)

【讨论】:

以上是关于加入两个数据框和结果数据框在 PySpark 中包含不重复的项目?的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:数据框在另一个数据框的列中按ID选择行

使用数据框在pyspark中获取列post group by

数据框在多列上连接,pyspark中的列有一些条件[重复]

加入两个数据框pyspark

加入两个 Pyspark 数据帧的两种方法有啥区别

加入两个分区数据框pyspark