在npm install -g npm
1.6 API(scala)中SparkSQL
具有相交和除外的函数,但不具有差异的函数。显然,union和except的组合可用于产生差异:
Dataframe
但这看起来有点尴尬。根据我的经验,如果某些东西看起来很尴尬,那么有更好的方法,特别是在Scala中。
答案 0 :(得分:30)
您始终可以将其重写为:
df1.unionAll(df2).except(df1.intersect(df2))
严重的是,UNION
,INTERSECT
和EXCEPT
/ 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)