gpt4 book ai didi

scala - 数据帧中的 OR 条件完全外部连接降低性能 spark/scala

转载 作者:行者123 更新时间:2023-12-04 16:00:22 25 4
gpt4 key购买 nike

我发现如果我的连接条件涉及 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) 可以表示为基于混洗的操作(排序合并连接或混洗哈希连接)- 这意味着每条记录必须转移到唯一子分区,基于连接条件中包含的所有表达式的散列。

    虽然在最坏的情况下(所有连接键都是常量并且在两个数据集之间匹配)它可以对所有记录进行 N*M 比较,并将所有记录洗牌到一个分区,典型的场景,对于现实生活中的数据,应该更多高效,进行大致 N + M 次比较。

  • 逻辑析取 (OR) 不能表示为简单的基于混洗的操作,因为可以匹配散列到不同存储桶的记录*。因此 Spark 使用笛卡尔积,然后选择总是多次传输每条记录并进行 N*M 比较。

关于scala - 数据帧中的 OR 条件完全外部连接降低性能 spark/scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51959023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com