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