Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark spark.sql.autoBroadcastJoinThreshold是否适用于使用Dataset的联接运算符的联接?_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark spark.sql.autoBroadcastJoinThreshold是否适用于使用Dataset的联接运算符的联接?

Apache spark spark.sql.autoBroadcastJoinThreshold是否适用于使用Dataset的联接运算符的联接?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我想知道spark.sql.autoBroadcastJoinThreshold属性是否有助于在所有工作节点上广播较小的表,同时进行连接,即使连接方案使用的是Dataset API连接而不是spark sql 如果我的大表是250千兆,小表是20千兆,我是否需要设置此配置:spark.sql.autoBroadcastJoinThreshold=21千兆,以便将整个表/数据集发送到所有工作节点 示例: 数据集API联接 val结果=rawBiger.asb.join 他妈的, rawBigger

我想知道spark.sql.autoBroadcastJoinThreshold属性是否有助于在所有工作节点上广播较小的表,同时进行连接,即使连接方案使用的是Dataset API连接而不是spark sql

如果我的大表是250千兆,小表是20千兆,我是否需要设置此配置:spark.sql.autoBroadcastJoinThreshold=21千兆,以便将整个表/数据集发送到所有工作节点

示例:

数据集API联接

val结果=rawBiger.asb.join 他妈的, rawBiggerFieldNames.CAMPAIGN_ID==smallerFieldNames.CAMPAIGN_ID, 左外 SQL

选择* 从较大的表b到较小的表s 其中,b.campign_id=s.campaign_id; 首先,spark.sql.autoBroadcastJoinThreshold和广播提示是独立的机制。即使禁用了autoBroadcastJoinThreshold,设置广播提示也将优先。使用默认设置:

spark.conf.getspark.sql.autoBroadcastJoinThreshold 字符串=10485760 val df1=spark.Range 100 val df2=spark.Range 100 Spark将使用autoBroadcastJoinThreshold并自动广播数据:

df1.joindf2,Seqid.explain ==实际计划== *项目[id0L] +-*BroadcastHashJoin[id0L],[id3L],内部,BuildRight :-*范围0,100,步长=1,分段=8 +-BroadcastExchange HashedRelationBroadcastModeListinput[0,bigint,false] +-*范围0,100,步长=1,分段=8 当我们禁用自动广播时,Spark将使用标准SortMergeJoin:

spark.conf.setspark.sql.autoBroadcastJoinThreshold,-1 df1.joindf2,Seqid.explain ==实际计划== *项目[id0L] +-*SortMergeJoin[id0L],[id3L],内部 :-*排序[id0L ASC NULLS FIRST],false,0 :+-Exchange hashpartitioning0l,200 :+-*范围0,100,步长=1,分段=8 +-*排序[id3L ASC NULLS FIRST],false,0 +-重用交换[id3L],交换哈希分区0L,200 但可以强制使用BroadcastHashJoin和广播提示:

df1.DF2,Seqid.explain ==实际计划== *项目[id0L] +-*BroadcastHashJoin[id0L],[id3L],内部,BuildRight :-*范围0,100,步长=1,分段=8 +-BroadcastExchange HashedRelationBroadcastModeListinput[0,bigint,false] +-*范围0,100,步长=1,分段=8 SQL有自己的提示格式,类似于配置单元中使用的提示格式:

df1.createOrReplaceTempViewdf1 df2.createOrReplaceTempViewdf2 spark.sql 从df1.id=df2.id上的df1 JOIN df2中选择/*+MAPJOINdf2*/* 解释 因此,为了回答您的问题,autoBroadcastJoinThreshold在使用Dataset API时适用,但在使用显式广播提示时不相关


此外,广播大型对象不太可能提供任何性能提升,并且在实践中经常会降低性能并导致稳定性问题。请记住,广播对象必须首先获取到驱动程序,然后发送到每个工作程序,最后加载到内存中。

只是为了分享从代码到源代码的详细信息

引用我的格式:

spark.sql.autoBroadcastJoinThreshold配置表的最大大小(以字节为单位),该表将在执行联接时广播到所有工作节点

通过将此值设置为-1,可以禁用广播

请注意,当前统计信息仅支持已运行命令ANALYZE TABLE COMPUTE statistics noscan的配置单元元存储表,以及直接对数据文件计算统计信息的基于文件的数据源表

spark.sql.autoBroadcastJoinThreshold默认为10M,即10L*1024*1024,spark将检查要使用的连接,请参阅执行计划策略

有6种不同的连接选择,其中包括使用BroadcastHashJoinExec或BroadcastNestedLoopJoinExec物理运算符进行广播

BroadcastHashJoinExec将在存在连接键且以下某个保持时被选择:

Join是可以广播的交叉、内部、左反、左外、左半和右Join side之一,即大小小于spark.sql.autoBroadcastJoinThreshold Join是一个交叉、内、右、外、左Join边都可以广播的连接,即大小小于spark.sql.autoBroadcastJoinThreshold 当没有连接键且上述BroadcastHashJoinExec条件之一成立时,将选择BroadcastNestedLoopJoinExec

换句话说,Spark将自动选择正确的连接,包括基于Spark.sql.autoBroadcastJoinThreshold属性的BroadcastHashJoinExec和其他要求,以及连接类型。

当然!这里:很高兴让Spark变得更好
== Physical Plan ==
*BroadcastHashJoin [id#0L], [id#3L], Inner, BuildRight
:- *Range (0, 100, step=1, splits=8)
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false]))
   +- *Range (0, 100, step=1, splits=8)