我需要比较 Spark 应用程序中的两个数据帧。我浏览了以下帖子。如何获取两个DataFrame之间的差异? https://stackoverflow.com/questions/36199901/how-to-obtain-the-difference-between-two-dataframes
但是,我不明白为什么最佳答案中的方法
df1.unionAll(df2).except(df1.intersect(df2))
比问题中的好
df1.except(df2).union(df2.except(df1))
谁能解释一下吗?
据我了解,后者适用于两个较小的数据集,前者适用于大型数据集。是因为后者将其作为 union 的一部分进行了区分吗?即使如此,如果两个数据框更可能具有相同的记录,则在后一种情况下我们正在处理一个小数据集。
让我们考虑这样一个场景:df1
and df2
(分别为 N 和 M 的大小)太大而无法广播,但之间没有重叠df1
and df2
.
我们称之为结果di
。在这种情况下df1.intersect(df2)
将需要对 N + M 行进行完全洗牌,但输出的大小将等于 0。在这种情况下df1.unionAll(df2).except(di)
可以作为广播连接执行(此类优化可能需要适应性执行 https://issues.apache.org/jira/browse/SPARK-9850除非用户强制制定特定计划)。还需要注意的是,此类计划不需要缓存。
相比之下,成本df1.except(df2).union(df2.except(df1))
关于交集的基数将是恒定的。
同时,如果d1
太大而无法广播,它已经有一个与以下兼容的分区except
,因此剩余的查询不需要额外的随机播放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)