[英]OR condition in dataframe full outer join reducing performance spark/scala
我看到如果我的连接条件涉及OR子句,则需要很长时间才能使用AND子句。 我正在做fullouter加入。
我的单元测试没有显示出重大差异,但是当针对大型数据集运行时,它运行速度非常慢
df1.join(df2, expr("id1 = id2 AND amount1 = amount2"), "fullouter").cache()
以下运行时间较长,即幅度慢〜10倍
df1.join(df2, expr("id1 = id2 OR amount1 = amount2"), "fullouter").cache()
有什么想法吗?
TL; DR预计这两者之间的性能差异。
逻辑连接( AND
)可以表示为基于shuffle的操作(排序合并连接或随机散列连接) - 这意味着必须根据连接中包含的所有表达式的哈希将每个记录转移到仅一个子分区条件。
虽然在最坏的情况下(所有连接键都是常量并且在两个数据集之间匹配),但是可以将N * M与所有拖曳到单个分区的记录进行比较,典型情况下,使用实际数据,应该更加高效,大致N + M比较。
逻辑析取( OR
)不能表示为简单的基于随机数的操作,因为可以匹配对不同桶的记录散列*。 因此,Spark使用笛卡尔积,然后选择总是多次传输每个记录并进行N * M比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.