加入期间的意外行为(仅在将列 '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:执行树”的主要内容,如果未能解决你的问题,请参考以下文章