Sql 临时视图和自动广播连接错误

Sql 临时视图和自动广播连接错误,sql,apache-spark-sql,pyspark-sql,Sql,Apache Spark Sql,Pyspark Sql,我在下面给出了一个查询,当我运行它时,Spark有时会抛出这个错误- org.apache.spark.SparkException: Could not execute broadcast in 300 secs. You can increase the timeout for broadcasts via spark.sql.broadcastTimeout or disable broadcast join by setting spark.sql.autoBroadcastJoinTh

我在下面给出了一个查询,当我运行它时,Spark有时会抛出这个错误-

org.apache.spark.SparkException: Could not execute broadcast in 300 secs. You can increase the timeout for broadcasts via spark.sql.broadcastTimeout or disable broadcast join by setting spark.sql.autoBroadcastJoinThreshold to -1
1 statement failed.

Execution time: 5m 56s 
我们从源代码中提取数据,并在临时视图的各个步骤中应用几个转换逻辑

我执行的查询的简化版本是-

create temporary view my_date AS
select max(max_eff_dt) as eff_dt
from (
      select max(eff_dt) as max_eff_dt from tableA
      union
      select max(eff_dt) as max_eff_dt from tableB
      union
      select max(eff_dt) as max_eff_dt from tableC
      );

create temporary view AS
select a.x, b.x, c.y, dt.eff_dt
from tableA a
inner join tableB  b
on a.x = b.x
inner join tableC c
on b.y = c.y
cross join my_date dt
where a.join_dt < dt.eff_dt
and   b.join_dt < dt.eff_dt
and   c.join_dt < dt.eff_dt;
然而,火花并不总是抛出这个错误,只是在某些时候

请任何人帮助我理解这个错误的原因,并减轻同样的问题。尽管set spark.sql.autoBroadcastJoinThreshold=-1会处理此错误,但我想了解此错误的原因以及如何修改代码以避免将来发生此错误。 此外,如果有人能给我提供有关Spark SQL查询性能调优的在线资源,那就太好了


如果需要有关此错误的其他信息,请告知我。

此错误意味着Spark正在为您的某些加入广播数据,并且没有在300秒内成功广播数据。此300秒阈值是内部配置设置的默认值,您可以按如下方式更改:

spark.conf.set("spark.sql.broadcastTimeout", n)

其中n是以秒为单位的时间。增加此阈值是避免此错误的一种方法。还可以根据集群的大小调整spark.sql.autoBroadcastJoinThreshold配置的值。通过设置值-1,您将完全禁用广播。此设置的默认值为10MB,因此您还可以通过调用spark.conf.getspark.sql.autoBroadcastJoinThreshold来检查环境中设置的值,并调整该值。当Spark估计数据的大小大于此阈值时,Spark将不广播,并将选择不同的算法,主要是SortMergeJoin,前提是您在查询中未使用广播提示。如果在查询中使用广播提示,则Spark将尝试广播,无论估计大小是多少,如果由于OOM错误或超时导致的错误导致数据大小过大,则可能会失败。

请解释要实现的逻辑。