MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
来源:互联网 发布:只读文件数据怎么修改 编辑:程序博客网 时间:2024/06/05 15:21
详细讲解SQL编译为MapReduce之前,我们先来看看MapReduce框架实现SQL基本操作的原理
Join的实现原理
select u.name, o.orderid from order o join user u on o.uid = u.uid;
在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。MapReduce的过程如下(这里只是说明最基本的Join的实现,还有其他的实现方式)
Group By的实现原理
select rank, isonline, count(*) from city group by rank, isonline;
将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key。MapReduce的过程如下(当然这里只是说明Reduce端的非Hash聚合过程)
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;
实现方式有两种:
(1)如果仍然按照上面一个distinct字段的方法,即下图这种实现方式,无法跟据uid和date分别排序,也就无法通过LastKey去重,仍然需要在reduce阶段在内存中通过Hash去重
(2)第二种实现方式,可以对所有的distinct字段编号,每行数据生成n行数据,那么相同字段就会分别排序,这时只需要在reduce阶段记录LastKey即可去重。
这种实现方式很好的利用了MapReduce的排序,节省了reduce阶段去重的内存消耗,但是缺点是增加了shuffle的数据量。
需要注意的是,在生成reduce value时,除第一个distinct字段所在行需要保留value值,其余distinct数据行value字段均可为空。
SQL转化为MapReduce的过程
了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:
- Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
- 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
- 遍历QueryBlock,翻译为执行操作树OperatorTree
- 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
- 遍历OperatorTree,翻译为MapReduce任务
- 物理层优化器进行MapReduce任务的变换,生成最终的执行计划
下面分别对这六个阶段进行介绍
- MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
- MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
- 【转载】MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
- MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
- datatable dinstinct creat join in group by
- MapReduce实现基本SQL操作的原理
- sql join、group by原理
- MySQL 中 GROUP BY 基本实现原理
- MySQL 中 GROUP BY 基本实现原理
- MySQL 中 GROUP BY 基本实现原理
- MySQL 中 GROUP BY 基本实现原理
- MySQL 中 GROUP BY 基本实现原理
- HiveSQL解析原理:包括SQL转化为MapReduce过程及MapReduce如何实现基本SQL操作
- HiveSQL解析原理:包括SQL转化为MapReduce过程及MapReduce如何实现基本SQL操作
- HiveSQL解析原理:包括SQL转化为MapReduce过程及MapReduce如何实现基本SQL操作
- MapReduce实现join操作
- MapReduce实现join操作
- MapReduce实现join操作
- Android Touch Event 超出范围
- shell awk命令
- CListCtrl控件的InsertItem和SetItemText和SetItem三个函数的区别
- 关于NT kernel&System占用80端口的问题如何解决
- 蒋介石的浪漫与悲情 --读《蒋介石1887~1975上》
- MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
- Android Canvas绘图详解(图文)
- 悲愤诗
- win 7 下硬盘安装ubuntu14.04注意事项
- 图片圆角和圆形
- ckeditor的使用
- java 扫雷游戏源码案例项目
- 安卓基础(一)
- cell高度自适应(做聊天气泡)