我是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,则将该表广播到执行器节点。
我应该广播";是的,如果这意味着查询速度更快并且有足够的资源(可以共享(。