首页 > 解决方案 > 加入期间的意外行为(仅在将列 'year' 重命名为 'year' 时才有效)否则将失败并显示“package.TreeNodeException:执行树”

问题描述

我有一个火花数据框,经过多次转换后需要与其父数据框之一连接。除非我将列“年份”重命名为“年份”,否则此连接将失败。我之前也遇到过这种行为,在 6-7 次转换后,需要将数据框与第 3 次转换的输出连接起来。

我不明白为什么会这样,所以我尝试了一些随机的事情,比如持久化,尝试使用 spark sql API 而不是 pyspark,但仍然遇到同样的问题。在 spark sql 的情况下,在重命名具有相同名称的列后连接也有效

由于某些限制,我无法共享代码,但一般代码流程就像

  DF =  spark.read(.......)

  subset DF

  df1 = transformation1 on DF 
  df2 = transformation2 on df1

  Subset df2
  df3 = transformation3 on df2

  #this fails 
  final = df2.alias('a').join(  df3.alias('b'),[conditon],'left').select('a.*')

  #this succeeds
  final = df2.withColumnRenamed('Year','Year').alias('a).join(  df3.alias('b'),[conditon],'left').select('a.*')

我无法提供堆栈跟踪,但会弹出类似这样的内容

     package.TreeNodeException: execute tree:

          Exhange hashpartitioning(.....)

                  remaining logical plan 

我最近刚开始使用 spark 并不太了解这里发生了什么,所以任何帮助将不胜感激

这也是我第一次发帖,所以欢迎任何关于如何更好地格式化问题的指示。

标签: apache-sparkpysparkpyspark-sql

解决方案


错误。我只是重命名。这是痛苦的。

请参阅如何解决 AnalysisException:Spark 中的已解析属性。其他场景也是如此。

另外如何在加入后重命名重复的列?. 在这方面关于SO的很多事情。

仍然使用最新版本的 Spark 2.4。


推荐阅读