在对AWS Glue Spark 2.2.1环境中的Spark SQL查询进行一些更改之后,我开始看到以下错误:
org.apache.spark.SparkException:由于阶段失败,作业被中止: 164个任务的序列化结果的总大小更大(1031.4 MB) 比spark.driver.maxResultSize(1024.0 MB)
我尝试使用set(“ spark.sql.autoBroadcastJoinThreshold”,“ -1”)禁用广播联接,并增加了maxResultSize,这引起了其他错误,但是问题一直存在,直到我替换了以下联接
X left outer join Y on array_contains(X.ids, Y.id)
使用
val sqlDF = spark.sql("select * from X lateral view explode(ids) t as id")
sqlDF.createOrReplaceTempView("X_exploded")
...
X_exploded left outer join Y on X_exploded.id = Y.id
我正在使用AWS Glue管理环境,但无权访问查询计划。但是,我很好奇为什么在array_contains上进行联接会导致比爆炸和使用精确匹配要多的数据带入驱动程序?
请注意,表X包含json / gzip格式的350KB数据,表Y包含约50GB的json / zip数据。
谢谢!
答案 0 :(得分:0)
看来,如果array_contains函数返回true,则较早的方法是将Y中的所有值都带入。
在后面的方法中,explode为每个元素创建新行,从而消除了任何重复并最终减少了返回的行数。
答案 1 :(得分:0)
您可以使用命令行--conf spark.driver.maxResultSize = 4g来增加最大结果大小。