java - 比较 Spark 中的两个数据帧(性能)

标签 java scala performance apache-spark apache-spark-sql

我需要比较我的 spark 应用程序中的两个数据帧。我浏览了以下帖子。 How to obtain the difference between two DataFrames?

但是,我不明白为什么最佳答案中的方法

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

比问题中的那个好

df1.except(df2).union(df2.except(df1))

谁能解释一下? 据我了解,后者适用于两个较小的数据集,而前者适用于大型数据集。是因为后者将不同作为联合的一部分吗?即使那样,如果两个数据框有相同记录的可能性更大,那么在后一种情况下我们处理的是一个小数据集。

最佳答案

让我们考虑这样一种情况,其中 df1df2(分别为 N 和 M)都太大而无法广播,但是 之间没有重叠df1df2

我们称它为结果 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/

相关文章:

javascript - 从对象中删除属性的真正方法(删除、空、未定义)

java - JNI获取ConcurrentHashMap

css - Angular:如何根据需要请求图像以加速加载(使用 ngx-bootstrap)

java - 我的自定义事件应该在 GUI EDT 还是 "home-grown"EDT 上触发

scala - Map 和 Set 的实际类(不是抽象的也不是特征)是什么?

scala - 如何在Slick2.0中使用DateTime?

java - 当我使用 akka 流在现有消费者组中创建新消费者时,如何寻求 kafka 主题的结束?

r - 如何将数据快速加载到R中?

java - 邮件或浏览失败 IOException

java - 如何注入(inject)自定义准备语句参数