博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大数据的仓库Hive原理(三)
阅读量:4263 次
发布时间:2019-05-26

本文共 1294 字,大约阅读时间需要 4 分钟。

      上次我们简单说了一下Hive的工作原理,今天我们来深入看一下它是如何把Hql语句转换为m/r来运行的。

1、编译器

  • 简介

          Hive编译器将一个Hive QL转换操作符。操作符Operator是Hive的最小的处理单元,每个操作符代表HDFS的一个操作或者一道MapReduce作业。

    Operator都是hive定义的一个处理过程,其定义有:

    protected List 
    > childOperators; protected List
    > parentOperators; protected boolean done; // 初始化值为false

          所有的操作构成了Operator图,hive正是基于这些图关系来处理诸如limit, group by, join等操作。

    这里写图片描述

  • 执行流程

    这里写图片描述

2、转换过程

Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
遍历AST Tree,抽象出查询的基本组成单元QueryBlock
遍历QueryBlock,翻译为执行操作树OperatorTree
逻辑层优化器进行OperatorTree变换,合并不必要的
ReduceSinkOperator,减少shuffle数据量
遍历OperatorTree,翻译为MapReduce任务物理层优化器进行MapReduce任务的变换,生成最终的执行计划

3、具体实现

  • 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即可完成去重

    这里写图片描述


总结:

      我们从认识Hive到理解它的运行原理,已经对其有了一定的了解。当然在实际应用中还会遇到各种问题,只要我们坚持去做,就没有什么做不到的。

你可能感兴趣的文章
c++11的时间库chrono
查看>>
c++11的闭包(lambda、function、bind)
查看>>
c++的多态(重载、覆盖、隐藏)
查看>>
关于字节序
查看>>
关于vector
查看>>
基于systemV的消息队列的多进程间CS通讯实现
查看>>
linux设备模型____宏观印象
查看>>
linux设备模型_____相关函数
查看>>
linux设备模型____I2C具体实现
查看>>
linux设备模型之sysfs使用
查看>>
linux的list常用函数用法速查及应用实例
查看>>
ARM架构内核启动分析-head.S(1.1、vmlinux.lds 链接脚本分析)
查看>>
ARM架构内核启动分析-head.S(1.2、stext分析之准备阶段)
查看>>
ARM架构内核启动分析-head.S(1.3、stext分析之内存临时页表建立)
查看>>
ARM架构内核启动分析-head.S(1.4、stext分析之打开MMU并跳到start kernel)
查看>>
arm-linux之uboot向内核传递参数
查看>>
arm-linux内存页表创建
查看>>
arm-linux之bootmem分配器
查看>>
Java中数组、List、Set、Map相互转换
查看>>
java读取Excel时对单元格cell时间格式的判断
查看>>