Hive学习笔记 之 Hive运行流程简析4

SemanticAnalyzer

首先,由Dirvercompile方法调用到SemanticAnalyzeranalyzeInternal方法来(前后可以添加自行开发的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的过程中,相对更完整更细节的处理了。

为了不重复制造轮子,直接贴出一篇经典的文章暂替这个章节,最近太忙了,后续再按照自己的理解重新补充这个章节的内容。

未完待续