【问题标题】:Spark SQL performing carthesian join instead of inner joinSpark SQL 执行笛卡尔连接而不是内部连接
【发布时间】:2015-11-18 09:07:11
【问题描述】:

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

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

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

【问题讨论】:

标签: scala apache-spark pyspark apache-spark-sql


【解决方案1】:

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

Constructing trivially true equals predicate [..]

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

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

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

解释。 看看这个操作流程:

如果您直接使用 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 ;)。

【讨论】:

  • 我在一个周末的大部分时间里都在努力解决 1.5.2 中的加入问题——这是两个问题之一,你的回答节省了很多挫败感。谢谢!
  • 在我开始研究 Spark 代码之前,我不得不经历同样的挫折;)。
  • 嗯,即使在今天(2020 年)也没有修复。有同样的问题。谢谢尼曼德。节省了我很多时间。
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多