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 ;)。
在执行了一些较早的计算之后,我正在尝试将两个 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 ;)。