1.join的实现原理
select u.name, o.orderid from order o join user u on o.uid = u.uid;
- 在map阶段的输出中给每个value一个tag,用于区分数据来源,在shuffle过程将具有相同key的数据合并在一起,在reduce阶段对key相同的不同来源的数据进行join。
2.group by的实现原理
select rank, isonline, count(*) from city group by rank, isonline;
- 将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key(避免使用Hash表,节省内存)。MapReduce的过程如下
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即可完成去重
-
如果有多个distinct字段呢,如下面的SQL
select dealid, count(distinct uid), count(distinct date) from order group by dealid;
可以对所有的distinct字段编号,每行数据生成n行数据,那么相同字段就会分别排序,这时只需要在reduce阶段记录LastKey即可去重。
执行count(distinct)时,若不使用group by,则会进入一个reduce执行所有的数据
按某字段进行分组之后,则可以进入不同的reduce进行执行
有多个count(distinct)字段时,则每一行数据可以分成多行去分别计算不同字段的数量