Spark SQL执行carthesian join而不是inner join

NNa*_*med 10 scala apache-spark apache-spark-sql

在尝试执行一些早期计算后,我试图将两个DataFrame相互连接起来.命令很简单:

    employee.join(employer, employee("id") === employer("id"))
Run Code Online (Sandbox Code Playgroud)

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

Nie*_*and 30

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

Constructing trivially true equals predicate [..]
Run Code Online (Sandbox Code Playgroud)

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

employee.select(<columns you want>, employee("id").as("id_e"))
Run Code Online (Sandbox Code Playgroud)

然后执行加入employee("id_e") === employer("id").

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

在此输入图像描述

如果直接使用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)
  }
Run Code Online (Sandbox Code Playgroud)

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

你很幸运,虽然看到警告信息,但不久前已经添加了 ;).