scala - 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 来启用隐式笛卡尔积;
解决方案
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|
+---+-----+----+------+
没有遇到任何问题。
推荐阅读
- android - FCM Android:不允许后台启动
- javascript - 在回调中使用 javascript nodejs 类方法并保留两个上下文
- c++ - 为什么私有继承对象允许成员函数将派生*转换为基*但外部不允许?
- aws-glue - aws 胶水增量加载关系数据库
- java - 如何让我的 GUI 显示符合 JTextFields 的 JLabels?
- exuberant-ctags - Exuberant Ctags 在空 *.ml 文件上产生“文件意外结束”错误
- c++ - 在不使用递归的情况下将 FFT 应用于两个非常大的数的乘法
- jmeter - Blazemeter - 将请求统计转换为秒
- math - Wolfram 函数“Integrate”的原理是什么
- c# - 我的代码不会将我的 CSV 文件读入我的对象列表