Spark 2.2.1:连接条件中的array_contains导致“大于spark.driver.maxResultSize”错误

时间:2019-01-27 20:16:45

标签: apache-spark apache-spark-sql aws-glue

在对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数据。

谢谢!

2 个答案:

答案 0 :(得分:0)

看来,如果array_contains函数返回true,则较早的方法是将Y中的所有值都带入。

在后面的方法中,explode为每个元素创建新行,从而消除了任何重复并最终减少了返回的行数。

答案 1 :(得分:0)

您可以使用命令行--conf spark.driver.maxResultSize = 4g来增加最大结果大小。