Hive_ Hive DISTINCT , JOIN 运行流程
对Hive 有一定了解的同学们,一定要对 Hive 几种常用的语句的内部运行机制做一定的了解。这样我们才能更好的去优化Hive,对SQL 做一定的调整。
下面我们主要通过
DISTINCT
JOIN
两类操作,详细的去介绍 Hive 底层 的 MapReduce 执行流程。
DISTINCT 流程图:
可以看到上面的第一个阶段就是 Mapping ,将数据切分成几个片段,读入进来
第二个阶段就是 Shuffling
从缓冲区写到磁盘的时候,会进行分区并排序,分区指的是某个key应该进入到哪个分区,同一分区中的key会进行排序
第三个阶段就是 Reducing, 由于这里面我们是 DISTINCT , 我们只需要对 相同 key 的 list, 任取一个就可以了。
JOIN 流程图
(JOIN / LEFT JOIN / RIGHT JOIN ) 都属于此类范畴
而 MAP JOIN 不属于此类范畴
Mapping 阶段主要是数据的读取,把数据分割,并作上标识。
比如
来源A 的数据为
a : [a,3,4,A]
b: [b,2,3,A]
c: [c,5,6,A]
来源B 的数据为
d:[d,20,B]
a:[a,2,B]
b:[b,9,B]
Shuffling 阶段涉及到了数据的排序,将相同 Key 的数据放在一起
Reducing 阶段, 相同的key 放到了一起,
比如 key : a
来源于A的组成了一个List
a:{[a,3,4]}
来源于B的组成了一个List
a{[a,2]}
由于不同来源相同的key 只有一个,所以是一对一的关系。
对于多对多关系,就会形成循环,最终会产生笛卡尔积。
同理,LEFT JOIN , RIGHT JOIN 流程类似。只是在筛选条件上有不同。