加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Spark SQL执行carthesian join而不是inner join

发布时间:2020-12-16 09:03:32 所属栏目:安全 来源:网络整理
导读:在尝试执行一些早期计算后,我试图将两个DataFrame相互连接起来.命令很简单: employee.join(employer,employee("id") === employer("id")) 但是,连接似乎执行了carthesian join,完全忽略了我的===语句.有谁知道为什么会这样? 解决方法 我想我也遇到了同样的
在尝试执行一些早期计算后,我试图将两个DataFrame相互连接起来.命令很简单:

employee.join(employer,employee("id") === employer("id"))

但是,连接似乎执行了carthesian join,完全忽略了我的===语句.有谁知道为什么会这样?

解决方法

我想我也遇到了同样的问题.检查您是否有警告:

Constructing trivially true equals predicate [..]

创建连接操作后.如果是这样,只需为员工或雇主DataFrame中的一列添加别名,例如像这样:

employee.select(<columns you want>,employee("id").as("id_e"))

然后执行员工加入(“id_e”)===雇主(“id”).

说明.
看看这个操作流程:

enter image description here

如果直接使用DataFrame A计算DataFrame B并将它们连接在来自DataFrame A的列Id上,则不会执行您想要执行的连接. DataFrameB中的ID列实际上是DataFrameA中完全相同的列,因此spark将断言该列与其自身相等,因此是一个简单的真正谓词.
?要避免这种情况,您必须为其中一列添加别名,以便它们显示为spark的“不同”列.目前只有警告信息以这种方式实现:

def === (other: Any): Column = {
    val right = lit(other).expr
    if (this.expr == right) {
      logWarning(
        s"Constructing trivially true equals predicate,'${this.expr} = $right'. " +
          "Perhaps you need to use aliases.")
    }
    EqualTo(expr,right)
  }

对我来说这不是一个非常好的解决方案(很容易错过警告信息),我希望这会以某种方式修复.

你很幸运能看到警告信息,it has been added not so long ago;).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读