hive sql源码解析

Hivesql ->mapreduce 简单的可以分为六个阶段:

1SQL词法,语法解析生成抽象语法树AST Tree     Antrl定义了SQL语法规则,完成SQL词法、语法解析,将SQL转化为抽象语法树AST Tree,树上的每个节点就是一个ASTNode;

2、遍历AST Tree,抽象出查询的基本组成单元QueryBlock     QueryBlock就是一个子查询

Select * from (select * from b) a;

QueryBlock1:select * from b;

QueryBlock2:select * from a;

3遍历QueryBlock,翻译成执行操作树OperatorTree

4、逻辑层优化器进行OperatorTree变化,合并不必要的ReduceSinkOperator,减少shuffle数据量

5、遍历OperatorTree,翻译成MapReduce任务(物理执行计划)

6、物理层优化器进行MapReduce任务的变换,生成最终的执行计划

下面对hive-2.3.9源码进行详细的分析:

    CliDriver类:
        685行:main()
        687行:run()
            694行:!oproc.process_stage1(args)   解析hiveconf参数,如日志级别;
            719行:!oproc.process_stage2(ss) 解析hive -i -f -e -S -H -hivevar等 如:hive -e "select * from student";
        760行:executeDriver(ss,conf,oproc);
            804行:setupConsoleReader();  初始化从console读取用户编辑的sql命令等;
                879行:setupCmdHistory();   设置hql命令历史记录相关操作;
            813行:while()循环不停的读取 命令 执行
            822行:processLine()  解析处理SQL
        349行 :processLine()
            353行:ctrl+c处理;
            388行:切分出每一个单独的sql;
            403行:processCmd(command)  执行每一条sql;
        117行:processCmd()
            129行:分支处理各种sql;
            184行:处理正真的sql:"select …" 这样的
        215行:processLocalCmd()
            233行:qp.run(cmd)  执行sql;
            245行:输出表头;
            254行:输出数据;
            279行:数据查询时间和行数信息;
        
    Driver类中run()  执行查询语句的方法
        1235行:run()
            1237行:runInternal() 该方法做两件事:1.编译:sql->物理执行计划;2、执行:LauchTask();
        1407行:runInternal()
            1457行:compileInternal(command,true); 编译
                1317行:compile(command,true,deferClose);编译,做了三件事
                    468行:ASTNodetree=ParseUtils.parse(command,ctx);  将hql转译成ASTNode抽象语法树;
                    506行:sem.analyze(tree,ctx);sem(SemacticAnalyzer(寓意分析器))将ASTNode转化成TaskTree (物理执行计划)
                    531行:plan=newQueryPlan(queryStr,sem,perfLogger.getStartTime(PerfLogger.DRIVER_RUN),queryId,queryState.getHiveOperation(),schema); 把TaskTree生成一个QueryPlan;
                     
            1526行:execute(true); 执行
            
    最重要的一个类:SemanticAnalyzer类:
        11128行:analyzeInternal(ASTNodeast,PlannerContextplannerCtx)
            抽象语法树 生成 解析树,AST Tree 仍然很复杂,不够结构化,不方便直接翻译成为MapReduce程序;AST Tree转化为QueryBlock就是将sql进一步抽象和结构化;QueryBlock是一条sql的最基本组成单元,包含三部分:输入源/计算过程/输出;简单来说:QueryBlock就是一个子查询;在这个环节中,会有和元数据库的交互;
            
            // 1. Generate Resolved Parse tree from syntax tree                  将AST Tree转化成解析树,先将AST Tree -> QueryBlock -> 解析树胡
            // 2. Gen OP Tree from resolved Parse Tree                             将解析树转化成Operator Tree
            // 3. Deduce Resultset Schema                                          推导结果模式,这里面有cbo优化,在多表join的时间自动的选择最有的join方式
            // 4. Generate Parse Context for Optimizer & Physical compiler          生成上下文件context对象
            // 5. Take care of view creation                                     处理试图操作
            // 6. Generate table access stats if required                        生成表的表访问信息
            // 7. Perform Logical optimization                                     添加各种优化器并依次执行逻辑优化
            // 8. Generate column access stats if required - wait until     
            column pruning takes place during optimization                        可能的情况下,做列裁剪
            // 9. Optimize Physical op tree & 
            Translate to target execution engine (MR,TEZ..)                        优化Operator Tree生成物理执行计划并指定执行引擎
            // 10. put accessed columns to readEntity                            封装查询的列到readEntity
            // 11. if desired check we're not going over partition scan limits    分区扫描的时候分区限制
 

大致流程图如下:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hive SQL语法树解析工具是一个用于解析Hive SQL语句的工具,它能够将输入的Hive SQL语句转换成一棵语法树,便于后续的语义分析和优化处理。 该工具的主要作用是对Hive SQL语句进行解析和分析,将其转换成一种抽象的语法树表示形式。语法树是一种树状结构,其中每个节点表示SQL语句中的一个元素,例如关键字、表名、列名、运算符等。通过解析Hive SQL语句并构建语法树,可以使得对SQL语句的解析和处理更加方便和灵活。 在Hive中,通过使用ANTLR等工具,可以实现Hive SQL语法树的解析操作。ANTLR是一种强大的解析器生成器,可以根据给定的语法规则自动生成解析器。通过编写Hive SQL语法的ANTLR规则,我们可以使用ANTLR工具生成相应的解析器,然后利用该解析器对Hive SQL语句进行解析和分析。 使用Hive SQL语法树解析工具,可以实现以下功能: 1. 将Hive SQL语句解析成语法树,方便后续的处理。 2. 对解析出的语法树进行语义分析,例如检查表和列的存在性、类型匹配等。 3. 对语法树进行优化处理,例如消除冗余的列、优化查询计划等。 4. 生成Hive执行计划,用于执行Hive SQL语句。 总之,Hive SQL语法树解析工具是一个十分重要的工具,它能够将Hive SQL语句转换成易于处理的语法树形式,方便进行语义分析和优化处理。这对于Hive的查询和数据处理非常有帮助。 ### 回答2: Hive SQL语法树解析工具是一种用于解析Hive SQL语句,并将其转换为语法树结构的工具。它可以帮助开发人员分析和理解Hive SQL语句的结构和含义。 Hive SQL语法树解析工具的工作原理是先对输入的Hive SQL语句进行词法分析,将其分解为一个个的词法单元,比如关键字、标识符、运算符等。然后,根据语法规则,将词法单元组合成语法单元,逐步构建语法树。 语法树是一种树状结构,它以SQL语句的语法规则为基础,将SQL语句以层次化的方式表示出来。每个节点代表一个语法单元,比如SELECT、FROM、WHERE等。节点之间通过父子关系连接起来,形成一棵树。 语法树的解析过程包括词法分析、语法分析和语义分析三个阶段。在词法分析阶段,工具会将输入的SQL语句拆分成一个个的词法单元。在语法分析阶段,工具会根据语法规则,将词法单元组合成语法单元,逐步构建语法树。在语义分析阶段,工具会进一步验证语法树的正确性,并进行语义解析,比如检查表和列的存在性、类型一致性等。 使用Hive SQL语法树解析工具可以帮助开发人员更好地理解和调试Hive SQL语句。通过查看语法树结构,可以清晰地了解SQL语句的组成部分和执行顺序。此外,语法树解析工具还可以用于编写自定义的Hive查询优化器和执行引擎,提高查询性能和效率。 总而言之,Hive SQL语法树解析工具是一种强大的工具,能够将Hive SQL语句解析为语法树结构,帮助开发人员分析和优化SQL查询语句。它在Hive生态系统中有着重要的作用。 ### 回答3: Hive SQL语法树解析工具是一种用于解析Hive SQL语句的工具。在Hive中,SQL语句被解析为一个语法树,然后通过语法树进行语义分析和执行计划生成。 Hive SQL语法树解析工具主要包括以下几个方面的功能: 1. 词法分析:将输入的SQL语句拆分成一个个的词法单元,如关键字、标识符、运算符等。 2. 语法分析:基于词法分析结果,将词法单元组织成语法规则所定义的语法结构,生成语法树。 3. 语义分析:对语法树进行语义检查,包括检查列或表是否存在、检查数据类型是否匹配等,确保SQL语句的合法性。 4. 执行计划生成:根据语法树和语义分析的结果,生成Hive SQL语句对应的执行计划,用于后续的查询执行。 Hive SQL语法树解析工具的作用是将用户输入的SQL语句转换为可执行的查询计划,为Hive查询引擎提供执行指令。它在Hive的查询过程中起到关键作用,有效地提高查询效率和查询执行的准确性。 总而言之,Hive SQL语法树解析工具是一种用于解析Hive SQL语句的工具,通过词法分析、语法分析、语义分析和执行计划生成等功能,将输入的SQL语句转换为可执行的查询计划。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值