首页 > 数据库 >Spark SQL五大关联策略

Spark SQL五大关联策略

时间:2024-01-22 10:47:30浏览次数:42  
标签:join 关联 广播 Join build SQL table Spark 连接

1、五种连接策略

选择连接策略的核心原则是尽量避免shuffle和sort的操作,因为这些操作性能开销很大,比较吃资源且耗时,所以首选的连接策略是不需要shuffle和sort的hash连接策略。

◦Broadcast Hash Join(BHJ):广播散列连接 ◦Shuffle Hash Join(SHJ):洗牌散列连接 ◦Shuffle Sort Merge Join(SMJ):洗牌排列合并联系 ◦Cartesian Product Join(CPJ):笛卡尔积连接 ◦Broadcast Nested Loop Join(BNLJ):广播嵌套循环连接

 

2、连接影响因素

2.1、连接类型是否为equi-join(等值连接)

等值连接是指一个连接条件中只包含“=”比较的连接,而非等值连接包含除“=”以外的任何比较,如“<、>、>=、<=”,由于非等值连接是对不确定值的范围比较,需要嵌套循环,所以只有CPJ和BMLJ两种连接策略支持非等值连接,对于等值连接,所有连接策略都支持。

2.2、连接策略提示(Join strategy hint

Spark SQL为开发人员提供了通过连接提示对连接策略选择进行一些控制,共支持4种连接提示(Spark3.0.0版本)。

▪BROADCAST ▪SHUFFLE_MERGE ▪SHUFFLE_HASH ▪SHUFFLE_REPLICATE_NL

使用示例:SELECT

/*+ BROADCAST(table_B) */ *

FROM

table_A

INNER JOIN

table_B

ON

table_A.id = table_B.id

2.3、连接数据集的大小(Size of Join relations)

选择连接策略最重要的因素是连接数据集的大小,是否可以选择不需要shuffle和sort的基于hash的连接策略,就取决于连接中涉及的数据集的大小。

3、连接策略优先级

 

 

4、五种连接策略运行原理

4.1、Broadcast Hash Join(BHJ):广播散列连接

主要分为两个阶段: 1.广播阶段:通过collect算子将小表数据拉到Driver端,再把整体的小表广播致每个Executor端一份。 2.关联阶段:在每个Executor上进行hash join,为较小的表通过join key创建hashedRelation作为build table,循环大表stream table通过join key关联build table。 ◦限制条件: 1.被广播的小表大小必须小于参数:spark.sql.autoBroadcaseJoinThreshold,默认为10M。 2.基表不能被广播,比如left join时,只能广播右表。 3.数据集的总行数小于MAX_BROADCAST_TABLE_ROWS阈值,阈值被设置为3.41亿行。

 

 

4.2、Shuffle Hash Join(SHJ):洗牌散列连接

主要分为两个阶段: 1.洗牌阶段:通过对两张表分别按照join key分区洗牌,为了让相同join key的数据分配到同一Executor中。 2.关联阶段:在每个Executor上进行hash join,为较小的表通过join key创建hashedRelation作为build table,循环大表stream table通过join key关联build table。 ◦限制条件: 1.小表大小必须小于参数:spark.sql.autoBroadcaseJoinThreshold(默认为10M) * shuffle分区数。 2.基表不能被广播,比如left join时,只能广播右表。 3.较小表至少比较大表小3倍以上,否则性能收益未必大于Shuffle Sort Merge Join。

 

 

4.3、Shuffle Sort Merge Join(SMJ):洗牌排列合并联系

主要分为两个阶段: 1.洗牌阶段:将两张大表分别按照join key分区洗牌,为了让相同join key的数据分配到同一分区中。 2.排序阶段:对单个分区的两张表分别进行升序排序。 3.关联阶段:两张有序表都可以作为stream table或build table,顺序迭代stream table行,在build table顺序逐行搜索,相同键关联,由于stream table或build table都是按连接键排序的,当连接过程转移到下一个stream table行时,在build table中不必从第一个行搜索,只需从与最后一个stream table匹配行继续搜索即可。 ◦限制条件: 1.连接键必须是可排序的。

 

 

4.4、Cartesian Product Join(CPJ):笛卡尔积连接

主要分为两个阶段: 1.分区阶段:将两张大表分别进行分片,再将两个父分片a,b进行笛卡尔积组装子分片,子分片数量:a*b。 2.关联阶段:会对stream table和build table两个表使用内、外两个嵌套的for循环依次扫描,通过关联键进行关联。 ◦限制条件: 1.left join广播右表,right join广播左表,inner join广播两张表。

 

 

 

4.5、Broadcast Nested Loop Join(BNLJ):广播嵌套循环连接

主要分为两个阶段: 1.广播阶段:通过collect算子将小表数据拉到Driver端,再把整体的小表广播致每个Executor端一份。 2.关联阶段:会对stream table和build table两个表使用内、外两个嵌套的for循环依次扫描,通过关联键进行关联。 ◦限制条件: 1.仅支持内连接。 2.开启参数:spark.sql.crossJoin.enabled=true。

 

作者:曲海龙

来源:京东云开发者社区 转载请注明来源

标签:join,关联,广播,Join,build,SQL,table,Spark,连接
From: https://www.cnblogs.com/jingdongkeji/p/17979464

相关文章

  • sqlglot python sql 解析以及翻译工具
    sqlglot实际上是由和sqlmesh一个团队开发的就用python的sql解析以及翻译工具,功能还是比较强大的支持20多种sql方言的格式化以及翻译,sqlmesh就使用了此工具包,当然相比其他一些工具,性能也是很不错的参考资料https://github.com/tobymao/sqlglothttps://sqlglot.com/sqlglot.html......
  • Mysql日志审计自动备份日志(按天)
    echooffecho------------------开始备份日志文件------------------setymd=%Date:~0,4%%Date:~5,2%%Date:~8,2%setbackup-dir=C:\tools\mysql-server-auditsetpwd=%你自己的数据库密码%echo备份目录:%backup-dir%echo--------------------------------------------------if......
  • 【LeetCode 2494. 合并在同一个大厅重叠的活动】[MySQL 用户变量/Pandas]面向过程编程
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/merge-overlapping-events-in-the-same-hall/MySQL代码#WriteyourMySQLquerystatementbelowwitht2as(select*#----只需要改动这里的逻辑,其他不要动。注意里面的语句是“顺序......
  • 【LeetCode1747. 应该被禁止的 Leetflex 账户】[MySQL 用户变量/Pandas]面向过程编程;
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/leetflex-banned-accounts/description/MySQL代码witht1as(selectaccount_id,ip_address,loginastick,"login"asmytypefromLogInfounionallselectaccount_id,ip......
  • 【LeetCode 2701. 连续递增交易】[MySQL 用户变量/Pandas]面向过程编程得到严格递增连
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/consecutive-transactions-with-increasing-amounts/MySQL代码#WriteyourMySQLquerystatementbelowwitht1as(select*#--------------------------只需要改动这里的逻辑,其他......
  • 【Leetcode1949. 坚定的友谊】使用MySQL在无向图中寻找{"CompleteTripartite", {1, 1,
    目录题目地址思路代码MySQL代码逐行翻译为Pandas代码等效Cypher查询(未验证)题目地址https://leetcode.cn/problems/strong-friendship/思路就是在无向图中寻找这个pattern:(*Mathematica*)GraphData[{"CompleteTripartite",{1,1,3}}]SQL写还是比较麻烦。更加复杂的查询还是......
  • 【Leetcode 2474. 购买量严格增加的客户】[MySQL 用户变量/Pandas]面向过程编程解决严
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/customers-with-strictly-increasing-purchases/description/MySQL代码#WriteyourMySQLquerystatementbelowwitht1as(selectcustomer_id,year(order_date)asmy_year,sum(price)......
  • SQL上下个月写法
    网上取当月第一天和最后一天的SQL语句很多,有的是通过字符截取,有的是通过函数,个人还是比较偏向于使用内置函数来处理,但是看了下网上的运用函数来取第一天和最后一天时间的SQL语句几乎都像下面这样的,其实是存在问题的,存在一个临界值得问题。  本月第一天:select  dateadd(......
  • [转帖]MySQL多版本并发控制机制(MVCC)-源码浅析
    https://zhuanlan.zhihu.com/p/144682180 MySQL多版本并发控制机制(MVCC)-源码浅析前言作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<<事务处理-概念与技术>>诚然讲的非常透彻,但只能提纲挈领,不能让你玩转某个真正的数据库。感谢c......
  • MySQL - 日志
    1.回滚日志(undolog)作用:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读内容:逻辑格式的日志(当delete一条记录是,记录一条对应的insert记录,反之亦然),在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态释放:当事务提交......