在运行我的spark-submit代码时,执行时出现此错误。
执行连接的Scala文件。
我很想知道这个TreeNodeException错误是什么。
为什么会出现此错误?
请分享您对此TreeNodeException错误的想法:
Exception in thread “main” org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
答案 0 :(得分:0)
我在加入数据框时也遇到了这个异常
Exception in thread “main” org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
要修复它,我只是颠倒了连接的顺序。也就是说,我没有做df1.join(df2,on_col =“ A”),而是做了df2.join(df1,on_col =“ A”)。不确定为什么会这样,但是我的直觉告诉我,当您使用前一个命令而不是后者时,Spark必须遵循的逻辑树是混乱的。您可以将其视为我的玩具示例中Spark必须与“ A”列进行比较的次数,才能将两个数据框都加入。我知道这不是一个确定的答案,但希望对您有所帮助。
答案 1 :(得分:0)
好的,所以上面给出的堆栈跟踪信息不足以理解根本原因,但是正如您所提到的,您正在使用联接很可能是因为这种情况。我在加入时也遇到了同样的问题,如果您深入研究堆栈跟踪,您将看到类似-
+- *HashAggregate(keys=[], functions=[partial_count(1)], output=[count#73300L])
+- *Project
+- *BroadcastHashJoin
...
Caused by: java.util.concurrent.TimeoutException: Futures timed out after [300 seconds]
这提示了失败的原因,Spark尝试使用具有超时和广播大小阈值的“广播哈希联接”进行联接,这两种情况均会导致上述错误。要根据基本错误进行修复-
增加“ spark.sql.broadcastTimeout”,默认值为300秒-
spark = SparkSession
.builder
.appName("AppName")
.config("spark.sql.broadcastTimeout", "1800")
.getOrCreate()
或增加广播阈值,默认值为10 MB-
spark = SparkSession
.builder
.appName("AppName")
.config("spark.sql.autoBroadcastJoinThreshold", "20485760 ")
.getOrCreate()
或通过将值设置为-1来禁用广播联接
spark = SparkSession
.builder
.appName("AppName")
.config("spark.sql.autoBroadcastJoinThreshold", "-1")
.getOrCreate()
更多详细信息可以在这里找到-https://spark.apache.org/docs/latest/sql-performance-tuning.html