SparkSql Join基本流程(hash join,broadcast join,shuffle hash join ,sort merge join)

Join

表信息和sql

表A : table_A,字段a1,a2,No
表B : table_B,字段b1,b2,No
select a1,a2,b1,b2 from table_A t_A join table_B t_B on t_A.No=t_B.No ;

总体流程

流程的设计

step1 : 遍历table_A 表的所有记录,以过滤条件中的字段No的值进行分组,每个No值对于的A组数据,遍历出来,待用
step2 : 遍历table_B 表的所有记录,同A的处理方式

拿出A组数据去匹配B组数据,以A组的No值去比较,匹配出满足A中No=x时候,B中No也等于x的值的哪些数据行,(过滤 filter)

然后根据select a1,a2,b1,b2 过滤出匹配到的记录行中的几个字段(裁剪 project)

考虑性能损耗点

算法上是 遍历A ,遍历B,取相同key值后,join
实现上是 A和B的数据特点:无序,分布存储在多台数据节点上

1、抽取数据损耗时间:根据No这个value值作为分区的,shuffle read/write ,同时shuffle A,B表,慢
2、无序数据如果能先排序好(A表B表各自根据No排序),则遍历过程中,不会重复从第一行全量变量抽取,而是按顺序抽取,减少重复,
假设排好序的A表中,No取x时,A表的指针从 [10000行到20000行]都是X,No取y时,A表指针直接从20001行开始取,B表同理 》》sort merge join
增加sort merge 过程
3、计算代码和数据运行的位置,
如果两个表都很大,则计算代码分布式,数据shuffle到各个物理节点上跑
如果两个表中有一个表比较小,则数据移动,每个运行的物理节点上,数据都加载到内存里面,直接从内存里面取优于从磁盘取,加快运行速度,去掉了shuf

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值