首页 文章

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

提问于
浏览
1

我通过执行下面的命令创建了两个数据框 . 我希望加入两个数据框,结果数据框包含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 is

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|
+---+--------+-----+

我想加入以下两个表格,如下所示 .

+---+--------+----------+----------+
|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 回答

  • 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

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

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

相关问题