MR实现HiveSQL的原理:
1.join
select u.name, o.orderid from order o join user u on o.uid = u.uid;
这是一条简单的关联sql查询,底层执行引擎是怎样实现的?
两张边作为输入,join的条件作为key,然后为其他值打上tag标记,经过shuffle,将key相同的数据发送到同一个Reduce上执行。
2.group by
select rank, isonline, count(*) from city group by rank, isonline;
在Map端将GroupBy的字段组合为key值(图中是rank和isonline),经过shuffle阶段,将相同的key发送到一个Reduce执行。
3.Distinct
select dealid, count(distinct uid) num from order group by dealid;
当只有一个distinct字段时,如果不考虑Map阶段的Hash GroupBy,只需要将GroupBy字段和Distinct字段组合为map输出key,利用mapreduce的排序,同时将GroupBy字段作为reduce的key,在reduce阶段保存LastKey即可完成去重。