查询计划广播NestedLoopJoin时禁用

查询计划广播NestedLoopJoin时如何禁用广播

写由亚当巴夫拉卡

2022年5月23日

文章解释当查询计划启动时如何禁用广播BroadcastNestedLoopJoin物理规划

设置广播阈值后,期望广播停止spark.sql.autoBroadcastJoinThreshold-1,但Apachespark试图广播大表并显示报错失效

行为并非错误,但可能出乎意料我们将审查预期行为 并提供一个缓冲选项 这个问题

创建表

启动创建二表,一表无效值带表Null和无无效值tblA_Null.

sqlslslsl

试图禁用广播

我们试图设置禁止广播spark.sql.autoBroadcastJoinThreshold查询带子查询条款

sqlspark.conf.sql.sql.autbroadcastJointhresword,-1sql

如果你审查查询计划BroadcastNestedLoopJoin是在这种情况中最后可能的回退甚至在试图禁用广播后也出现

物理计划*(2)广播LoopJoin构建权,leftAnti,(id#2482L=id2483L)#Isnull(d#2482L=id2483L)
          
           +-广播交换身份播客模式,[id#2586]+-*(1)FileScan默认.tbla_norull[id#2483L]bashed:真,DataFilters:[],格式:Parquet,位置:MeoryFileIndexs/dbfs/user/hive/ware/tbla_nunell
           
          

数据处理量足够大时,Spark试图广播表时产生广播错误

重写查询使用不存在取而代之

可重写查询解决不存在取而代之.

sql///它可重写成非EXISTS,它会成为例式加入:sql

通过使用不存在中查询使用排序MegeJoin.

物理计划SortMeorgeJoinsid#2482Lss,d#2483Lst:-sort[id#2482LASCNULSISIPS],0:+交换散列served#2482LLS200
          
           +-sort[id#2483LNULLSIGS]、伪版0+交换散列dexs
           
          

解释

Spark不自动处理,因为spark和SQL对无效处理有略微不同的语义处理

SQL不进表示如果内有无效值不进值,结果为空正因如此,它只能用BroadcastNestedLoopJoin.全部不进值必须已知以确保集中无空值

示例笔记本

笔记本有完全例子显示Spark不自动切换的原因BroadcastNestedLoopJoin排序MegeJoin.

复习BroadcastNestedLoopJoin示例笔记本.



文章有帮助吗