首页 > 解决方案 > Left Join 错误:org.apache.spark.sql.AnalysisException:检测到隐式笛卡尔积

问题描述

“左连接”需要“spark.sql.crossJoin.enabled=true”或在一个数据帧上调用“persist()”。

SELECT * FROM LHS left join RHS on LHS.R = RHS.R

如何在没有“spark.sql.crossJoin.enabled=true”和持久化数据框的情况下使“左连接”工作?

以下异常发生在 Spark 2.3.3 和 2.4.4 中。

线程“主”org.apache.spark.sql.AnalysisException 中的异常:检测到逻辑计划 OneRowRelation 和...之间的 LEFT OUTER 连接的隐式笛卡尔积......连接条件丢失或微不足道。要么:使用 CROSS JOIN 语法来允许这些关系之间的笛卡尔积,要么:通过设置配置变量 spark.sql.crossJoin.enabled=true 来启用隐式笛卡尔积;

标签: scalaapache-sparkapache-spark-sql

解决方案


Spark2.4.3 使用数据框

scala> var lhs = spark.createDataFrame(Seq((1,"sda"),(2,"abc"))).toDF("id","value")
scala> var rhs = spark.createDataFrame(Seq((2,"abc"),(3,"xyz"))).toDF("id1","value1")

scala> lhs.join(rhs,col("id")===col("id1"),"left_outer")

scala> lhs.join(rhs,col("id")===col("id1"),"left_outer").show
+---+-----+----+------+
| id|value| id1|value1|
+---+-----+----+------+
|  1|  sda|null|  null|
|  2|  abc|   2|   abc|
+---+-----+----+------+

没有遇到任何问题。

在此处输入图像描述


推荐阅读