如何获取两个DataFrame之间的差异?

时间:2016-03-24 12:11:40

标签: scala apache-spark apache-spark-sql

npm install -g npm 1.6 API(scala)中SparkSQL具有相交和除外的函数,但不具有差异的函数。显然,union和except的组合可用于产生差异:

Dataframe

但这看起来有点尴尬。根据我的经验,如果某些东西看起来很尴尬,那么有更好的方法,特别是在Scala中。

5 个答案:

答案 0 :(得分:30)

您始终可以将其重写为:

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

严重的是,UNIONINTERSECTEXCEPT / MINUS几乎是一组标准的SQL组合运算符。我不知道任何系统提供开箱即用的XOR操作。很可能是因为使用其他三个实现起来很简单,并且没有太多优化。

答案 1 :(得分:6)

为什么不在下面?

df1.except(df2)

答案 2 :(得分:1)

请注意,EXCEPT(或MINUS只是EXCEPT的别名)会对结果进行重复数据删除。所以如果你期望"除了" set(你提到的差异)+"相交"设置为等于原始数据帧,请考虑保留重复项的此功能请求:

https://issues.apache.org/jira/browse/SPARK-21274

正如我在那里写的那样,"除了所有"可以在Spark SQL中重写为

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

答案 3 :(得分:0)

如果您正在寻找Pyspark解决方案,则应使用减去()docs

此外,unionAll在2.0中已弃用,请改用union()。

df1.union(df2).subtract(df1.intersect(df2))

答案 4 :(得分:-1)

我认为使用左联接然后过滤掉空值可能会更有效。

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