很少在博客里写翻译的东西, 这次例外. 原文在这儿
. 译文掺杂了些自己的表述。
解析器(Parser)
解析器 由antlr生成, 文法定义在Hive.g文件中。它的功能是将查询字符串翻译成抽象语法树(Abstract Syntax Tree, 简称AST).
语法分析器(Semantic Analyzer)
语法分析器将AST转换成内部查询形式,此形式为查询块(Query Block), 而不是一棵操作符树(Opertator Tree).
它还验证查询语句中的列名, 符号"*" 等. 同时这一环节还进行类型检查, 隐式类型转换.
如果被查询的表是带分区(Partition)的表,则所有关于该表的表达式都将被收集起来,以备裁剪不必要的分区时使用;如果查询语句包含采样
(Sampling)操作,也会收集这些表达式.
逻辑计划生成器(Logic Plan Generator)
逻辑计划生成器将内部查询形式(即上文提到过的查询块)转换成逻辑计划。逻辑计划是一棵操作符树。其中部分操作符是关系代数操作符,例如
filter, join操作符。还有部分操作符是hive特有的操作符,它们将被翻译为mapreduce作业, 例如,
reduceSink操作符。它出现在map与reduce的分界处。
此环节还包含优化器。优化器修改查询计划以提高查询的效率。例如: 把一系列join操作合并到一个join中; group by操作的map端聚合; 将group by分为两步,以防数据倾斜,造成某个reducer负担过重,成为瓶颈。
每个操作符,都包含一个描述符(descriptor)。描述符是可序列化的对象。
查询计划生成器(Query Plan Generator)
即数据库理论中的物理查询计划生成器。它将逻辑计划转换成一系列的map-reduce任务(见ql/exec/MapRedTask类)。具体操
作是递归访问操作符树,将它们分成一系列序列化的map-reduce任务, 然后将任务提交给hadoop分布式系统。
reduceSink是map与reduce的分界线,它的描述符包含归约键(reduction keys), 归约键是mapper的输出键,
即也是reduce的输入键。如果查询中包含采样/分区, 则也会有相应的计划。计划被序列化到一个plan.[0-9]+文件里,
它是一个xml格式的文件。
Distinct的改造
SemanticAnalyzer.genGroupByPlanReduceSink() 方法根据GroupBy与distinct function信息组合成了redcueKeys,再将它放入reduceSinkDesc对象中(reduceSinkDesc.keyCols).这个keyCols的类型是ArrayList<exprNodeDesc>,即表达式数组,其实它应该为一个ArrayList<ArrayList<exprNodeDesc>> 或者HashMap<String, ArrayList<exprNodeDesc>>以支持多种key输出
reduceSinkDesc被ExecDriver序列化提交到hive.scratchdir目录下的plan.[0-9]+文件. hive.scratchdir一般在hive-site.xml中定义,是hive在hdfs上的一个存放临时文件的目录. ExecMapper与ExecReduce在configure的时候, 会读取这些plan.[0-9]+文件, 反序列化mapRedWork对象, 初始化各Operator等.
将ReduceSinkOperator.keyEval改成ExprNodeEvaluator[][]的二维数组以支持多个key输出
Map会以MapOperator为操作符树的根结点, Reduce一般以GroupByOperator为操作符树的根结点
分享到:
相关推荐
使用hive3.1.2和spark...所以,如果想要使用高版本的hive和hadoop,我们要重新编译hive,兼容spark3.0.0。除了兼容spark3.0.0外,还将hive3.1.2的guava的版本进行了提升,和hadoop3.x保持一致,以便兼容hadoop3.1.3。
hive对应spark3.x编译
hive编译源码的资料
HiveSQL编译原理
补丁文件包,依赖包,hive3.1.2-spark3.0.0和hive3.1.3-spark3.1.3二进制包已经全部放进该压缩
Hive的核心原理讲解,主要讲述Hive解析编译SQL语句,生成执行计划的过程。文档涉及关键代码说明。
CentOS系统已经编译好的hive数据仓库,安装使用详细步骤请参考博客:https://blog.csdn.net/z1987865446/article/details/109136651
1、MapReduce实现基本SQL操作的原理 1.1 Join的实现原理 1.2 Group By的实现原理 1.3 Distinct的实现原理 2.1 Phase1 SQL词法,语法解析 2.1.1 Antlr 2.1.2 抽象语法树AST Tree 2.1.3 样例SQL ........... ...
解决Hive show create table重编译的jar包 Hive2.1.1版本
atlas hive hook 资源包
hive on spark要求spark中不包含hive的jar包,必须重新编译,历尽艰辛终于搞好了,适配hive2.3、hadoop2.7.6环境。
apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)
hive旅游-hive旅游系统-hive旅游系统源码-hive旅游管理系统-hive旅游管理系统java代码-hive旅游系统设计与实现-基于springboot的hive旅游系统-基于Web的hive旅游系统设计与实现-hive旅游网站-hive旅游网站代码-hive...
通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解。对这一过程的理解不仅帮助我们解决了一些Hive的bug,也有利于我们优化HiveSQL,提升我们对Hive的掌控...
hive hive hive hive hive hive hive hive hive hive hive hive
eclipse下编译Hive,这个文档是网上下的,还可以
apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)
spark2.3.1-with-hive编译版本,
设计开发 Hive 编程指南 完整版 设计开发 Hive 编程指南 完整版
hive-jdbc