Hive中Join优化的几种算法

文章目录

  • 1. Common Join
  • 2. Map Join
  • 3. Bucket Map Join
  • 4. Sort Merge Bucket Map Join ( SMB Map Join )

1. Common Join

Common Join 是最稳定且默认的Join算法,通过 MR Job 完成 Join 。

需要注意的是,在三个表的 Join 关联中,如果这三个表的关联 key 相同,那么 key 就被在shuffle 后被发送到同一个 Reduce Task 中,因此三表关联时,可能会启动2个 MR Job,也可能会启动1个 MR Job。

2. Map Join

Map Join 通过两个 Map 任务,在 Map 阶段完成 Join 关联。

该算法适用于大表关联小表,第一个 Map Job 启动本地任务读取小表中的数据,首先将其制作为 Hash Table,再将其上传到分布式缓存(HDFS)中,第二个 Map Job 将小表读取至内存,并且扫描大表,在 Map Job 中完成两表的关联,因此可以不走 Reduce。

3. Bucket Map Join

Bucket Map Join 是 Map Join 的升级版,适用于大表和大表的 Join 关联。

Bucket Map Join 的条件是要求参与 Join 的表都是分桶表,关联 key 为分桶字段,且其中一张表的分桶数量是另一张表分桶数量的整数倍,这是为了保证每个分桶都有对应的关联桶,避免奇数桶找不到对应关系。

条件满足后,便可以在两表的分桶间进行 Map Join,第二个 Map Job 无序再读取缓存小表,只需缓存分桶即可完成 Join。

4. Sort Merge Bucket Map Join ( SMB Map Join )

SMB Map Join 是基于 Bucket Map Join 的升级版,特点是速度快。

SMB Map Join 要求分桶内的数据是有序的,且分桶、排序、关联的字段 key 是相同的,并且满足其中一个表的桶是另一个表中桶的整数倍。

与 Bucket Map Join 算法不同的是,Bucket Map Join 实现算法原理仍然是 Hash Table,SMB Map Join 使用 Sort Merge Join 算法,该算法利用两个表桶中的key,顺序扫描完成 Join 关联。

由于不用制作 Hash Table,因此不需要缓存桶,所以 SMB Map Join 对内存没有要求,而 Bucket Map Join 仍然需要缓存表,对内存有一定要求。

你可能感兴趣的:(Hadoop生态,hive,hadoop,数据仓库)