Spark SQL中的广播加入



我是Spark的新手,有一个关于广播加入的问题。我们使用Spark 2.4.0并使用Spark临时视图进行数据转换-

create temporary view product as
select /*+ BROADCAST(b) */
a.custid, b.prodid
from cust a
join prod b
on a.prodid = b.prodid

我知道broadcast加入spark.sql.autoBroadcastJoinThreshold有一个参数,它的值为10,即10MB。但是,我在某个地方也读到广播表的最大大小可能是8GB。这两个价值观的意义是什么?

对于广播表/视图,大小是否必须始终为MB,或者是否也可以广播(带提示(5GB的表/视图(例如(?在这种情况下,我是否必须通过将参数spark.sql.autoBroadcastJoinThreshold的值设置为更高的值(=5120,即5GB(来操纵它?或者,它是否允许我广播该表/视图,因为它低于最大限制(即8GB(?

如果我想广播一个表(以GB为单位(,建议从查询性能的角度来看吗?

感谢您的帮助。

感谢

  • 如果您没有在via-DF语法的SQL中通过提示显式声明广播,那么对于已知大小为10MB的表,Catalyst可能会选择使用广播连接方法。

  • 如果您确实明确声明了广播联接,那么如果表大小超过8GB,Catalyst将忽略并在广播联接上使用另一个联接策略。

  • 更正式的:

如果指定了广播提示,则带有该提示的联接端将广播而不考虑autoBroadcastJoinThreshold。如果两侧的具有广播提示,具有较小将广播估计的物理大小。如果没有提示并且如果表的估计物理大小<autoBroadcastJoinThreshold,则将该表广播到执行器节点。

我应该广播";是的,如果这意味着查询速度更快并且有足够的资源(可以共享(。

最新更新