MapReduce实现sql的原理

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)字段时,则每一行数据可以分成多行去分别计算不同字段的数量

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值