似乎在 spark 2.2.1 和 spark 2.4.0 之间,具有空右数据帧的左连接的行为从成功更改为返回“AnalysisException:检测到逻辑计划之间的 LEFT OUTER 连接的隐式笛卡尔积”。
例如:
val emptyDf = spark.emptyDataFrame
.withColumn("id", lit(0L))
.withColumn("brand", lit(""))
val nonemptyDf = ((1L, "a") :: Nil).toDF("id", "size")
val neje = nonemptyDf.join(emptyDf, Seq("id"), "left")
neje.show()
Run Code Online (Sandbox Code Playgroud)
在 2.2.1 中,结果是
+---+----+-----+
| id|size|brand|
+---+----+-----+
| 1| a| null|
+---+----+-----+
Run Code Online (Sandbox Code Playgroud)
但是,在 2.4.0 中,我收到以下异常:
org.apache.spark.sql.AnalysisException: Detected implicit cartesian product for LEFT OUTER join between logical plans
LocalRelation [id#278L, size#279]
and
Project [ AS brand#55]
+- LogicalRDD false
Join condition is missing or trivial.
Either: use the CROSS JOIN syntax to allow cartesian products between these
relations, or: enable implicit cartesian products by setting the configuration
variable spark.sql.crossJoin.enabled=true;
Run Code Online (Sandbox Code Playgroud)
这是后者的完整计划解释:
+---+----+-----+
| id|size|brand|
+---+----+-----+
| 1| a| null|
+---+----+-----+
Run Code Online (Sandbox Code Playgroud)
补充意见:
这是回归还是设计?早期的行为对我来说似乎更正确。我在 spark 发行说明、spark jira 问题或 stackoverflow 问题中找不到任何相关信息。
我没有遇到你的问题,但至少有同样的错误,我通过明确允许交叉连接来修复它:
spark.conf.set( "spark.sql.crossJoin.enabled" , "true" )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11661 次 |
| 最近记录: |