在PySpark中连接两个数据框和结果数据框是否包含非重复项?

时间:2018-02-12 07:23:49

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我通过执行以下命令创建了两个数据帧。我想要 加入两个数据框,结果数据框包含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|
+---+--------+----------+----------+

2 个答案:

答案 0 :(得分: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|
+---+--------+----------+----------+

答案 1 :(得分:1)

您只需重命名 SRank列名称并使用外部联接并使用na.fill函数

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