date: 2020-07-08 15:12:00

updated: 2020-08-21 17:38:00

Hive源码解析

入口:hive-cli-1.1.0-cdh5.14.4.jar!/org/apache/hadoop/hive/cli/CliDriver.class

参考文档

1. 启动

命令行输入 hive 后,启动log进程,建立一个客户端Session,获取到服务器的hive conf配置文件,启动客户端

启动后 executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc) 一直监听输入的 line; line 会按照 ; 来进行分割拼接成 command,对每一个 command 依次进行处理。command 一共分四种情况:① quit\exit ② source FilePath 指定执行某个文件里的语句 ③ 以 ! 开头的 shell 命令 ④ 本地客户端的各种命令(processLocalCmd(String cmd, CommandProcessor proc, CliSessionState ss))

通过读取 conf 配置,拿到 Driver 信息,然后交给对应的 Driver 来执行命令:org.apache.hadoop.hive.ql.Driver.compile(String command, boolean resetTaskIds, boolean deferClose)

2. 解析命令

在 Driver 拿到命令后,runInternal(command, alreadyCompiled); 判断是否已经编译过,如果没有的话,首先要进行语法解析,通过 org.apache.hadoop.hive.ql.parse.parseDriver.parse(String command, Context ctx) 生成 AST(AbstractSyntaxTree) 抽象语法树

在 parse 目录下存放5个文件
- HiveLexer.g :定义Hive关键字,及组成词组的合法字符
定义的规则如下:
```
KW_SELECT : 'SELECT';
KW_WHERE : 'WHERE';
KW_FROM : 'FROM';
fragment
Letter
: 'a'..'z' | 'A'..'Z'
;
```
- SelectClauseParser.g :定义select语句的语法规则
- FromClauseParser.g :定义from语句的语法规则
- IdentifiersParser.g :定义函数、group等的语法规则
- HiveParser.g:定义语法规则文件,引入了其他语法规则文件

BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(this.conf, tree); 对拿到的AST进行解析

this.schema = getSchema(sem, this.conf); 返回Hive表的字段信息

this.plan = new QueryPlan(queryStr, sem, perfLogger.getStartTime("Driver.run"), queryId, SessionState.get().getHiveOperation(), this.schema, this.queryDisplay); 生成执行计划

this.plan.getFetchTask().initialize(this.conf, this.plan, (DriverContext)null); 对执行计划中拉取数据的任务进行初始化

针对 QueryPlan,调用 Driver.exexute() 执行job

String queryId = this.conf.getVar(ConfVars.HIVEQUERYID);
String queryStr = HiveConf.getVar(this.conf, ConfVars.HIVEQUERYSTRING);

3. Hive 可使用的函数

hive-exec 包下 org.apache.hadoop.hive.ql.exec.FunctionRegistry.java

Hive源码解析的更多相关文章

  1. 利用hive源码解析sql查了哪些表哪些字段

    在hiveserver2中使用了org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer对抽象语法树(AST)进行语义分析,分析的过程可以得出hive查 ...

  2. [源码解析]Oozie来龙去脉之提交任务

    [源码解析]Oozie来龙去脉之提交任务 0x00 摘要 Oozie是由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是Hadoop平台的开源的工作流调度引擎,用来管理Hadoop ...

  3. [源码解析]Oozie来龙去脉之内部执行

    [源码解析]Oozie来龙去脉之内部执行 目录 [源码解析]Oozie来龙去脉之内部执行 0x00 摘要 0x01 Oozie阶段 1.1 ActionStartXCommand 1.2 HiveAc ...

  4. Sqoop源码解析

    date: 2020-05-31 12:09:00 updated: 2020-08-21 17:33:00 Sqoop源码解析 org.apache.sqoop 文件夹 参考文档: https:// ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  9. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

随机推荐

  1. SpringBoot框架:两个方法同时调用时父方法使内部方法的DataSource注解失效的解决办法

    一.问题如下: 使用的是SpringBoot框架:通过AOP和自定义注解完成druid连接池的动态数据源切换(三)中的两个数据库spring_boot_demo和other_data. 在UserCo ...

  2. Java操作Elasticsearch 之 [Java High Level REST Clientedit]

    1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json. 向 Ela ...

  3. 刷题[SUCTF 2019]CheckIn

    解题思路 打开网页发现只是简单做了一个上传界面,朴实无华 上传一个php文件,发现非法后缀. 上传一个.htaccess文件,发现,爆出很重要的信息 exif_imagetype函数通过检测文件头来检 ...

  4. PHP:文件包含漏洞

    简单记录一些文件包含漏洞的常用方法 产生原因: 文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校检被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 ...

  5. 谷歌发布Flutter Alpha:支持Windows

    老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...

  6. 普转提Day2

    T1 给定一个区间,求这个区间中只有一个数字与其他数组不相同的数的个数. 给出的区间范围较大,但是要求的数比较少.所以我的想法是这样的:因为这些数只有一个数字和每个数字都相同的数不同,所以考虑将所有数 ...

  7. 日志分析平台ELK之日志收集器logstash

    前文我们聊解了什么是elk,elk中的elasticsearch集群相关组件和集群搭建以及es集群常用接口的说明和使用,回顾请查看考https://www.cnblogs.com/qiuhom-187 ...

  8. Java知识系统回顾整理01基础07类和对象01引用

    一.引用的定义 引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用. 二.引用和指向 new Hero(); 代表创建了一个Hero对象 但是也仅仅是创建了一个对象,没有办法 ...

  9. 生成器generator和迭代器Iterator

    一.列表生成式       在学习生成器迭代器之前先了解一下什么是列表生成式,列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式.什么意思?举个例子,如果想生成列表[0,1,2 ...

  10. USB口,串口,以太网口简介

    USB口 一.什么是USB? USB是英文Universal Serial Bus的缩写,中文含义是"通用串行总线".它是一种应用在PC领域的新型接口技术.早在1995年,就已经有 ...