如何在Scala中避免DataFrame中的Cartesian加入?

时间:2016-10-29 17:12:33

标签: spark-dataframe

请参阅以下数据框

我希望在匹配两个数据帧的col1后,在col2中得到不匹配的行 我正在尝试关注,但它没有产生结果,因为似乎Dataframe连接正在形成笛卡儿

val dfs = Seq((1,1),(1,2),(1,3),(2,6)).toDF("col1","col2")
val dft = Seq((1,1),(1,2),(1,4)).toDF("col1","col2") 

dfs.join(dft,"col1").filter(dfs("col2").notEqual(dft("col2"))).show

在上述情况下,我希望加入&过滤返回结果(1,3) 但似乎它将dfs中col1的每一行连接到dft上col1中的每一行,从而产生不需要的结果

Cartesion是否遵循Dataframe加入的正常行为,或者我错过了某些设置?我怎样才能得到(1,3)作为输出?

scala> dft.join(dfs,dft("col1")===dfs("col1")).show
+----+----+----+----+
|col1|col2|col1|col2|
+----+----+----+----+
|   1|   1|   1|   3|
|   1|   1|   1|   2|
|   1|   1|   1|   1|
|   1|   2|   1|   3|
|   1|   2|   1|   2|
|   1|   2|   1|   1|
|   1|   4|   1|   3|
|   1|   4|   1|   2|
|   1|   4|   1|   1|
+----+----+----+----+

由于 chetab

1 个答案:

答案 0 :(得分:1)

这不是笛卡尔积。您按col1加入,因此输出包含匹配col1的行的所有组合。结果是正确的。