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)
对我来说这不是一个非常好的解决方案(很容易错过警告信息),我希望这将以某种方式修复.
你很幸运,虽然看到警告信息,但不久前已经添加了 ;).
归档时间: |
|
查看次数: |
4606 次 |
最近记录: |