PySpark:在完全联接后删除重复项时,如何仅保留左表中的行?

PySpark:在完全联接后删除重复项时,如何仅保留左表中的行?,pyspark,Pyspark,在完全联接后删除重复项时,如何保留来自左表的行?我想要两个表的所有行,除非有重复的行,然后我从正确的表中丢弃该行 我尝试了以下方法,但没有成功: schema=[“名称”、“来源”、“分数”] 行1=[(“史密斯”,“顶点”,98), (“琼斯”,“极致”,30), (“芬奇”,“极致”,62), (“刘易斯”,“极致”,59), (“斯塔尔”,“极致”,87)] 第2行=[(“史密斯”,“贝塔”,64), (“琼斯”,“贝塔”,75), (“布莱恩”,“贝塔”,93), (“刘易斯”,“贝塔”

在完全联接后删除重复项时,如何保留来自左表的行?我想要两个表的所有行,除非有重复的行,然后我从正确的表中丢弃该行

我尝试了以下方法,但没有成功:

schema=[“名称”、“来源”、“分数”]
行1=[(“史密斯”,“顶点”,98),
(“琼斯”,“极致”,30),
(“芬奇”,“极致”,62),
(“刘易斯”,“极致”,59),
(“斯塔尔”,“极致”,87)]
第2行=[(“史密斯”,“贝塔”,64),
(“琼斯”,“贝塔”,75),
(“布莱恩”,“贝塔”,93),
(“刘易斯”,“贝塔”,59),
(“斯塔尔”,“贝塔”,81)]
df1=spark.createDataFrame(行1,架构)
df2=spark.createDataFrame(第2行,架构)
jdf=df1.alias(“a”).join(other=df2.alias(“b”),on=“name”,how=“full”)
jdf=jdf.orderBy(“name”).dropDuplicates([“name”])
对于[“来源”,“分数”]中的列:
jdf=jdf.withColumn(colName=col,col=(F.col(“a.”+col)如果F.col(“a.”+col).isNotNull()否则F.col(“b.”+col)))
上述内容无效,并导致此错误:

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
我试图达到的结果是:

+-----+------+-----+
| name|source|score|
+-----+------+-----+
|Bryan|  Beta|   93|
|Finch|  Acme|   62|
|Jones|  Acme|   30|
|Lewis|  Acme|   59|
|Smith|  Acme|   98|
|Starr|  Acme|   87|
+-----+------+-----+
您可以使用该函数。它返回第一个非空列。因此,首先提供左表中的列,然后提供右表中的列以进行合并

df2 = df2.withColumnRenamed("source", "source2").withColumnRenamed("score", "score2")

from pyspark.sql.functions import coalesce

df1.join(df2, ['name'], "full").withColumn('source', coalesce('source', 'source2'))\
    .withColumn('score', coalesce('score', 'score2')).drop('source2', 'score2').show()

+-----+------+-----+
| name|source|score|
+-----+------+-----+
|Bryan|  Beta|   93|
|Finch|  Acme|   62|
|Jones|  Acme|   30|
|Lewis|  Acme|   59|
|Smith|  Acme|   98|
|Starr|  Acme|   87|
+-----+------+-----+

一些似乎有效的方法:我使用“左反”联接从右列获取不匹配的行,然后将其与左表合并

schema=[“名称”、“来源”、“分数”]
行1=[(“史密斯”,“顶点”,98),
(“琼斯”,“极致”,30),
(“芬奇”,“极致”,62),
(“刘易斯”,“极致”,59),
(“斯塔尔”,“极致”,87)]
第2行=[(“史密斯”,“贝塔”,64),
(“琼斯”,“贝塔”,75),
(“布莱恩”,“贝塔”,93),
(“刘易斯”,“贝塔”,59),
(“斯塔尔”,“贝塔”,81)]
df1=spark.createDataFrame(行1,架构)
df2=spark.createDataFrame(第2行,架构)
jdf=df2.join(df1,on=“name”,how=“leftanti”)
udf=df1.union(jdf)

琼斯的预期输出应该是:
|Jones | Acme | 30 |
?是的,感谢您对这个细节的密切关注。我来修这根柱子。