hive执行计划分析(join详解)

我们都知道执行的hive sql是需要编译成MapReduce任务去执行的,那是如何编译的呢,可以分为六个阶段:

  1. Antlr定义SQL的语法规则,完成SQL词法、语法解析,将SQL转化为抽象语法树AST Tree
  2. 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
  3. 遍历QueryBlock,翻译为执行操作树OperatorTree
  4. 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
  5. 遍历OperatorTree,翻译为MapReduce任务
  6. 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

通过六个阶段得到了执行计划,通过执行计划我们可以清楚的知道,sql的执行顺序以及执行过程,这样有助于我们对底层的理解以及对代码的优化,提高执行效率

下面我们来看看怎么查看执行计划:

语法:
 EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query

查看执行计划的关键词为:EXPLAIN
官方文档上也有详细的描述:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain

我们来看一个简单的例子:
hive> explain select * from test.test8;
OK
STAGE DEPENDENCIES:
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        TableScan
          alias: test8
          Statistics: Num rows: 1 Data size: 38 Basic stats: COMPLETE Column stats: NONE
          Select Operator
            expressions: user_id (type: int), name (type: string), address (type: string)
            outputColumnNames: _col0, _col1, _col2
            Statistics: Num rows: 1 Data size: 38 Basic stats: COMPLETE Column stats: NONE
            ListSink

Time taken: 0.791 seconds, Fetched: 17 row(s)
执行计划第一部分:
STAGE DEPENDENCIES,各stage之间的依赖关系,就是执行的顺序
STAGE DEPENDENCIES:
  Stage-0 is a root stage
执行计划第二部分:
STAGE PLANS,详细的执行计划

这里只有一步,没有依赖的操作,比较简单

STAGE PLANS:
  Stage: Stage-0

抓取数据操作,没有limit限制

    Fetch Operator
      limit: -1

表扫描,表别名为test8

        TableScan
          alias: test8

需要查询的字段,user_id 、name 、address以及字段类型

          Select Operator
            expressions: user_id (type: int), name (type: string), address (type: string)

输出字段

outputColumnNames: _col0, _col1, _col2

如果是MR任务的话,
分为 Map Operator Tree和Reduce Operator Tree,如果中间有过滤操作的话,Filter Operator,聚合操作Group By Operator,join操作Join Operator等等。

下面我们来看几个复杂一点的例子:
聚合操作:
hive> explain select
    >   apptypeid,
    >   uid,
    >   srcqid,
    >   os,
    >   isnewuser,
    >   SUM(pv) AS pv,
    >   dt
    > FROM dw_center.dwb_open_srcqid_os_ver_user
    > where dt='20210727'
    > 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值