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

Posted

技术标签:

【中文标题】加入期间的意外行为(仅在将列 \'year\' 重命名为 \'year\' 时才有效)否则将失败并显示“package.TreeNodeException:执行树”【英文标题】:Unexpected behavior during Join (only works if rename column 'year' as 'year' ) otherwise fails with "package.TreeNodeException: execute tree"加入期间的意外行为(仅在将列 'year' 重命名为 'year' 时才有效)否则将失败并显示“package.TreeNodeException:执行树” 【发布时间】:2019-08-17 09:35:10 【问题描述】:

我有一个 spark 数据框,经过多次转换后,它需要与其父数据框之一连接。除非我将列“年份”重命名为“年份”,否则此连接将失败。我以前也遇到过这种行为,在 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 并不太了解这里发生了什么,所以任何帮助将不胜感激

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

【问题讨论】:

【参考方案1】:

错误。我只是重命名。很痛苦。

见How to resolve the AnalysisException: resolved attribute(s) in Spark。其他场景也是如此。

还有How to rename duplicated columns after join?。在这方面关于 SO 的很多事情。

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

【讨论】:

以上是关于加入期间的意外行为(仅在将列 'year' 重命名为 'year' 时才有效)否则将失败并显示“package.TreeNodeException:执行树”的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名 df 列而不将列列表临时存储到变量中?

在 Rails 视图中循环遍历对象数组:意外行为

在 PostgreSQL 中将双精度转换为文本时出现意外行为

WebSocket 握手期间出错:意外的响应代码:302

用名称中的句点重命名clickhouse中的列

如何在将上传的文件保存到目录之前重命名?