在 SparkSQL 1.6 api(scala) Dataframe 具有“相交”和“除”的函数,但没有“差”的函数。显然,可以使用并集和除的组合来产生差异:
SparkSQL
Dataframe
df1.except(df2).union(df2.except(df1))
但这似乎有点尴尬。根据我的经验,如果有些事情看起来很尴尬,有更好的方法来做,尤其是在scala中。
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
ktecyv1j2#
我认为使用左连接然后过滤空值会更有效。
df1.join(df2, Seq("some_join_key", "some_other_join_key"),"left") .where(col("column_just_present_in_df2").isNull)
laximzn53#
您可以随时将其重写为:
df1.unionAll(df2).except(df1.intersect(df2))
说真的尽管这样 UNION , INTERSECT 以及 EXCEPT / MINUS 基本上是一组标准的sql组合运算符。我不知道有哪个系统提供了类似xor的开箱即用操作。很可能是因为使用其他三种方法实现起来很简单,而且没有太多需要优化的地方。
UNION
INTERSECT
EXCEPT
MINUS
hjzp0vay4#
如果您正在寻找pyspark解决方案,则应该使用subtract()文档。此外,unionall在2.0中不受欢迎,请改用union()。 df1.union(df2).subtract(df1.intersect(df2))
df1.union(df2).subtract(df1.intersect(df2))
kiayqfof5#
为什么不在下面呢?
df1.except(df2)
5条答案
按热度按时间csbfibhn1#
请注意,except(或minus,它只是except的别名)将产生重复数据消除。因此,如果您希望“except”set(您提到的diff)+“intersect”set等于原始Dataframe,请考虑保留重复项的特性请求:
https://issues.apache.org/jira/browse/spark-21274
正如我在那里写的,“except all”可以在sparksql中重写为
ktecyv1j2#
我认为使用左连接然后过滤空值会更有效。
laximzn53#
您可以随时将其重写为:
说真的尽管这样
UNION
,INTERSECT
以及EXCEPT
/MINUS
基本上是一组标准的sql组合运算符。我不知道有哪个系统提供了类似xor的开箱即用操作。很可能是因为使用其他三种方法实现起来很简单,而且没有太多需要优化的地方。hjzp0vay4#
如果您正在寻找pyspark解决方案,则应该使用subtract()文档。
此外,unionall在2.0中不受欢迎,请改用union()。
df1.union(df2).subtract(df1.intersect(df2))
kiayqfof5#
为什么不在下面呢?