pyspark v 1.6数据帧没有左反连接?

2024-04-27 03:07:32 发布

您现在位置:Python中文网/ 问答频道 /正文

也许我完全误解了这一点,但基本上有2个dfs,我不想得到df1中所有不在df2中的行,我想这就是左反联接的作用,pyspark v1.6显然不支持左反联接

df1:

+----+---+
| id | x |
+----+---+
| 1  | a |
| 2  | b |
| 3  | c |
| 4  | d |
+----+---+

df2:

+----+---+
| id | x |
+----+---+
| 1  | a |
| 2  | b |
+----+---+

desired output df3:

+----+---+
| id | x |
+----+---+
| 3  | c |
| 4  | d |
+----+---+

我正在努力:

df3 = df1.where(~col("id").isin(df2["id"]))

这给了我0行的.count()

以及:

df3 = df1.join(df2, on = ["id"], how = "leftanti")

为此,我得到以下异常:

IllegalArgumentException: u"Unsupported join type 'leftanti'. Supported join types include: 'inner', 'outer', 'full', 'fullouter', 'leftouter', 'left', 'rightouter', 'right', 'leftsemi'."

谢谢你的帮助


Tags: idoutputoncountcolwherepysparkdf1
2条回答

我们可以模拟leftantileft join连接,并且只从df2中的id中过滤空列

Example:

df1.alias("a").join(df2.alias("b"),col("a.id") == col("b.id"),"left").filter("b.id is null").select("a.*").show()
#+ -+ -+
#| id|  x|
#+ -+ -+
#|  3|  c|
#|  4|  d|
#+ -+ -+

从Spark2.4+开始,我们可以在这种情况下使用^{}函数:

df1.exceptAll(df2).show()

#+ -+ -+
#| id|  x|
#+ -+ -+
#|  3|  c|
#|  4|  d|
#+ -+ -+

我很喜欢Spark 1.6的@Shu(不幸的是,它仍然在许多遗留系统中使用)的答案,如果有人需要的话,我将其推广到以后使用:

def subtractByKey(df1, df2, key):
    return (df1.alias("a").join(df2.alias("b"), on=F.col("a.{key}".format(key=key)) == F.col("b.{key}".format(key=key)), how="left")
            .where("b.{key} IS NULL".format(key=key))
            ).select("a.*")

在最近的Spark版本中,同样的行为也可以通过

df1.join(df2, on=key, how="left_anti")

相关问题 更多 >