我需要比较我的 spark 应用程序中的两个数据帧。我浏览了以下帖子。 How to obtain the difference between two DataFrames?
但是,我不明白为什么最佳答案中的方法
df1.unionAll(df2).except(df1.intersect(df2))
比问题中的那个好
df1.except(df2).union(df2.except(df1))
谁能解释一下? 据我了解,后者适用于两个较小的数据集,而前者适用于大型数据集。是因为后者将不同作为联合的一部分吗?即使那样,如果两个数据框有相同记录的可能性更大,那么在后一种情况下我们处理的是一个小数据集。
最佳答案
让我们考虑这样一种情况,其中 df1
和 df2
(分别为 N 和 M)都太大而无法广播,但是 之间没有重叠df1
和 df2
。
我们称它为结果 di
。在这种情况下,df1.intersect(df2)
将需要 N + M 行的完全洗牌,但是输出的大小将等于 0。在这种情况下,df1.unionAll(df2 ).except(di)
可以作为广播连接执行(此类优化可能需要 adaptive execution 除非用户强制执行特定计划)。同样重要的是要注意,这样的计划不需要缓存。
相比之下,关于交集的基数,df1.except(df2).union(df2.except(df1))
的成本将保持不变。
同时,如果d1
太大而无法广播,它已经有一个与except
兼容的分区,所以剩下的查询应该不需要额外的shuffle .
关于java - 比较 Spark 中的两个数据帧(性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54077336/