0
点赞
收藏
分享

微信扫一扫

hive join 的工作机制


目录

  • ​​hive join 简介​​
  • ​​hive join 的工作机制​​
  • ​​Common Join 工作机制​​
  • ​​Map Join 工作机制​​

hive join 简介

as we all know,hive会将HQL语句翻译成为mr任务,但:

  1. 如果多张表使用​​同一列​​做join,则被翻译成一个mr任务
  2. 如果多张表使用​​不同列​​​做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 工作机制

hive join 的工作机制_数据

  1. 先运行一个Task A,(它是一个Local Task,在客户端本地执行的Task),负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中
  2. 在运行一个Task B,该任务是一个没有Reduce的mr,启动MapTasks扫描大表a,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果,由于MapJoin没有Reduce,所以由Map直接输出结果文件,有多少个Map Task,就有多少个结果文件


举报

相关推荐

0 条评论