Scala spark中groupBy/join操作的意外缓存行为

Scala spark中groupBy/join操作的意外缓存行为,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我一直在尝试在一个基本数据帧(比如df1)上进行多个聚合。 当我运行以下代码时 df1.cache() val df2 = df1.groupBy(col("col1"),col("col2") as "col6").agg(sum("col3")) val df3 = df1.groupBy(col("col1"),col("col4") as "col6"

我一直在尝试在一个基本数据帧(比如df1)上进行多个聚合。 当我运行以下代码时

df1.cache()
val df2 = df1.groupBy(col("col1"),col("col2") as "col6").agg(sum("col3"))
val df3 = df1.groupBy(col("col1"),col("col4") as "col6").agg(sum("col5"))
val df4 = df2.join(df3,Seq("col1","col6"),"outer")
df4.count()
在生成的查询计划和spark UI的SQL选项卡上。我看到df2是df1的内存表扫描,而d1的完整DAG是为生成df3而执行的

在执行联接时重命名列1时

df1.cache()
val df2 = df1.groupBy(col("col1") as "col1",col("col2") as "col6").agg(sum("col3"))
val df3 = df1.groupBy(col("col1") as "col1",col("col4") as "col6").agg(sum("col5"))
val df4 = df2.join(df3,Seq("col1","col6"),"outer")
df4.count()
两个DFs都是内存表扫描

我不认为这会有什么不同,有人能解释一下为什么会发生这种情况吗


PS:我还注意到,如果没有连接查询计划,两个df的连接查询计划都在内存表扫描中。

Spark中曾经有一个错误,如果在DAG中连接两个具有相同最终父级的数据集,它将破坏连接并进行交叉连接。这可能是修复的人工制品?然而,这当然也是一个bug。Spark中曾经有一个bug,如果在DAG中连接两个具有相同最终父级的数据集,它将破坏连接并进行交叉连接。这可能是修复的人工制品?然而,这当然也是一个bug。