Hive学习笔记 之 Hive运行流程简析4
SemanticAnalyzer
首先,由Dirver
的compile
方法调用到SemanticAnalyzer
的analyzeInternal
方法来(前后可以添加自行开发的hook)。
processPositionAlias
先将所有的别名给处理了,接下来会进入到具体处理语法分析的方法analyzeCreateTable
中,遍历AST树,根据其不同的Token
来执行不同的操作,比如设置存储格式,列信息、表名、表属性等信息。具体到这里的例子来说,由AST中可以看到,根节点TOK_CREATETABLE
下挂有5个子节点,分别是表名、LIKE表、列信息、SERDE、存储格式。
其中,前3个子节点中,第二个为空说明不是CREATE LIKE方式创建表,那么表名和列信息就做了简单的存储动作;在第四个子节点中,处理SERDE信息会调用analyzeRowFormat方法,此处将列分隔符设置成了半角的逗号;第五个子节点,说明文件的存储格式,有几个descriptor通过一个工厂类来返回其对应的inputformat和outputformat。
TOK_CREATETABLE
TOK_TABNAME
t1
TOK_LIKETABLE
TOK_TABCOLLIST
TOK_TABCOL
id
TOK_INT
TOK_TABCOL
name
TOK_STRING
TOK_TABLEROWFORMAT
TOK_SERDEPROPS
TOK_TABLEROWFORMATFIELD
','
TOK_FILEFORMAT_GENERIC
textfile
完事儿后,AST的基本处理已经完成,AST树上的果实也都摘了下来并且保存起来了,然后新建一个任务描述类Work的派生类对象DDLWork并装入当前任务的描述类对象CreateTableDesc
,然后从TaskFactory
工厂中得到对应的DDLTask
,并加入task待执行队列,这时候,该SQL语句的完整过程就已经结束了,从analyze中退出(但是说好的复杂的analyze方法呢?这里先不急,因为这仅仅是第一个最简单的例子了)。
完事之后,做一些简单的校验,之后就可以生成我们的查询计划QueryPlan
对象了。
这货接下来会接管semanticAnalyzer
对象中生成的几乎所有有效信息,包括该SQL语句、生成的task列表、权限信息等。生成fetchtask,鉴权等等完成后,我们的compile
就算结束了。
第二个例子
上面这个例子显得过于简单了,但是这个例子还是相对清晰地指出了我们在compile阶段究竟经历了哪些阶段。那么,这时候我们需要一个更复杂的例子来说明,我们从AST->OP->TASK的过程中,相对更完整更细节的处理了。
为了不重复制造轮子,直接贴出一篇经典的文章暂替这个章节,最近太忙了,后续再按照自己的理解重新补充这个章节的内容。
未完待续