如何获得两个Dataframe之间的对称差异?

owfi6suc  于 2021-05-29  发布在  Spark
关注(0)|答案(5)|浏览(477)

SparkSQL 1.6 api(scala) Dataframe 具有“相交”和“除”的函数,但没有“差”的函数。显然,可以使用并集和除的组合来产生差异:

df1.except(df2).union(df2.except(df1))

但这似乎有点尴尬。根据我的经验,如果有些事情看起来很尴尬,有更好的方法来做,尤其是在scala中。

csbfibhn

csbfibhn1#

请注意,except(或minus,它只是except的别名)将产生重复数据消除。因此,如果您希望“except”set(您提到的diff)+“intersect”set等于原始Dataframe,请考虑保留重复项的特性请求:
https://issues.apache.org/jira/browse/spark-21274
正如我在那里写的,“except all”可以在sparksql中重写为

SELECT a,b,c
FROM    tab1 t1
     LEFT OUTER JOIN 
        tab2 t2
     ON (
        (t1.a, t1.b, t1.c) = (t2.a, t2.b, t2.c)
     )
WHERE
    COALESCE(t2.a, t2.b, t2.c) IS NULL
ktecyv1j

ktecyv1j2#

我认为使用左连接然后过滤空值会更有效。

df1.join(df2, Seq("some_join_key", "some_other_join_key"),"left")
.where(col("column_just_present_in_df2").isNull)
laximzn5

laximzn53#

您可以随时将其重写为:

df1.unionAll(df2).except(df1.intersect(df2))

说真的尽管这样 UNION , INTERSECT 以及 EXCEPT / MINUS 基本上是一组标准的sql组合运算符。我不知道有哪个系统提供了类似xor的开箱即用操作。很可能是因为使用其他三种方法实现起来很简单,而且没有太多需要优化的地方。

hjzp0vay

hjzp0vay4#

如果您正在寻找pyspark解决方案,则应该使用subtract()文档。
此外,unionall在2.0中不受欢迎,请改用union()。 df1.union(df2).subtract(df1.intersect(df2))

kiayqfof

kiayqfof5#

为什么不在下面呢?

df1.except(df2)

相关问题