目录
- hive join 简介
- hive join 的工作机制
- Common Join 工作机制
- Map Join 工作机制
hive join 简介
as we all know,hive会将HQL语句翻译成为mr任务,但:
- 如果多张表使用
同一列
做join,则被翻译成一个mr任务 - 如果多张表使用
不同列
做join,则被翻译成多个mr任务
(1)一个mr任务
SELECT a.val, b.val, c.val
FROM a
JOIN b ON (a.key = b.key1)
JOIN c ON (c.key = b.key1)
(2)多个mr任务
SELECT a.val, b.val, c.val
FROM a
JOIN b ON (a.key = b.key1)
JOIN c ON (c.key = b.key2)
一般来说,map过程负责分发数据,具体的join操作在reduce完成
。但如果多表基于不同的列做join,则无法在一轮mr任务中
将相关数据分发到到同一个reducer中,所以对于多表join,hive会将前面的表结果,先缓存在reducer的内存中,然后让后面的表会流式进入reducer中,和其进行join
下边以一个mr任务,来解释hive join 的工作机制
hive join 的工作机制
Common Join 工作机制
Hive中的Join可分为Common Join(Reduce阶段完成join)和Map Join(Map阶段完成join
Map阶段
先读取源表数据,然后经Map处理后进行输出,数据输出的形式为key/value,key为on条件中的某一列(如果Join有多个关联键,则以这些关联键的组合作为key),value为select或者where中需要用到的列(同时在value中还会包含表的Tag信息,用于标明此value对应哪个表)
Shuffle阶段
按照key进行hash,结果相同的被送往到同一reducer中
Reduce阶段
按照key完成join操作(期间通过Tag来识别不同表中的数据)
Map Join 工作机制
- 先运行一个Task A,(它是一个Local Task,在客户端本地执行的Task),负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中
- 在运行一个Task B,该任务是一个没有Reduce的mr,启动MapTasks扫描大表a,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果,由于MapJoin没有Reduce,所以由Map直接输出结果文件,有多少个Map Task,就有多少个结果文件