Spark SQL 执行笛卡尔连接而不是内部连接

Spark SQL performing carthesian join instead of inner join

在执行了一些较早的计算之后,我正在尝试将两个 DataFrame 相互连接起来。命令很简单:

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

然而,join好像是执行carthesian join,完全忽略了我的===声明。有谁知道为什么会这样?

我想我也遇到过同样的问题。检查是否有警告:

Constructing trivially true equals predicate [..]

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

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

然后在 employee("id_e") === employer("id") 上执行连接。

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

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

    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 ;)。