`
bupt04406
  • 浏览: 347794 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

explain一条HiveSQL,分析这个结果

    博客分类:
  • Hive
阅读更多
create table src119(key string, value string);

EXPLAIN
FROM src119 SELECT key , count(distinct value) group by key

ABSTRACT SYNTAX TREE:
  (TOK_QUERY (TOK_FROM (TOK_TABREF src119)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL key)) (TOK_SELEXPR (TOK_FUNCTIONDI count (TOK_TABLE_OR_COL value)))) (TOK_GROUPBY (TOK_TABLE_OR_COL key))))

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Alias -> Map Operator Tree:
        src119
          TableScan
            alias: src119
            Select Operator
              expressions:
                    expr: key
                    type: string
                    expr: value
                    type: string
              outputColumnNames: key, value
              Group By Operator
                aggregations:
                      expr: count(DISTINCT value)
                bucketGroup: false
                keys:
                      expr: key
                      type: string
                      expr: value
                      type: string
                mode: hash
                outputColumnNames: _col0, _col1, _col2
                Reduce Output Operator
                  key expressions:
                        expr: _col0
                        type: string
                        expr: _col1
                        type: string
                  sort order: ++
                  Map-reduce partition columns:
                        expr: _col0
                        type: string
                  tag: -1
                  value expressions:
                        expr: _col2
                        type: bigint
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: count(DISTINCT KEY._col1:0._col0)
          bucketGroup: false
          keys:
                expr: KEY._col0
                type: string
          mode: partials
          outputColumnNames: _col0, _col1
          File Output Operator
            compressed: false
            GlobalTableId: 0
            table:
                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

  Stage: Stage-2
    Map Reduce
      Alias -> Map Operator Tree:
        file:/tmp/tianzhao/hive_2011-06-11_05-50-09_095_6055107404619839036/-mr-10002
            Reduce Output Operator
              key expressions:
                    expr: _col0
                    type: string
              sort order: +
              Map-reduce partition columns:
                    expr: _col0
                    type: string
              tag: -1
              value expressions:
                    expr: _col1
                    type: bigint
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: count(VALUE._col0)
          bucketGroup: false
          keys:
                expr: KEY._col0
                type: string
          mode: final
          outputColumnNames: _col0, _col1
          Select Operator
            expressions:
                  expr: _col0
                  type: string
                  expr: _col1
                  type: bigint
            outputColumnNames: _col0, _col1
            File Output Operator
              compressed: false
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

  Stage: Stage-0
    Fetch Operator
      limit: -1


输入数据是:
86val_87
238val_22
86val_165
409val_419
86val_255
238val_278
86val_98
484val_488
311val_341
238val_278


FROM src119 SELECT key , count(distinct value) group by key
238 2
311 1
409 1
484 1
86 4



(TOK_QUERY
(TOK_FROM (TOK_TABREF src119))
(TOK_INSERT
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE))
(TOK_SELECT
(TOK_SELEXPR (TOK_TABLE_OR_COL key))
(TOK_SELEXPR (TOK_FUNCTIONDI count (TOK_TABLE_OR_COL value)))
)
(TOK_GROUPBY (TOK_TABLE_OR_COL key))
)
)


  Stage: Stage-1
    Map Reduce
  Stage: Stage-2
    Map Reduce
  这里的Map Reduce说明这两个Stage都是MapReduce job。
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1   // Stage-2依赖Stage-1,Stage-1先运行。


分析Stage-1:
      Alias -> Map Operator Tree:  //Map阶段
        src119
          TableScan
            alias: src119
            Select Operator
              expressions:
                    expr: key
                    type: string
                    expr: value
                    type: string
              outputColumnNames: key, value
              Group By Operator
                aggregations:
                      expr: count(DISTINCT value)
                bucketGroup: false
                keys:
                      expr: key
                      type: string
                      expr: value
                      type: string
                mode: hash
                outputColumnNames: _col0, _col1, _col2
                Reduce Output Operator
                  key expressions:
                        expr: _col0
                        type: string
                        expr: _col1
                        type: string
                  sort order: ++
                  Map-reduce partition columns:
                        expr: _col0
                        type: string
                  tag: -1
                  value expressions:
                        expr: _col2
                        type: bigint
  上面的 Map Operator Tree 说明这个是MapReduce job在Map阶段执行的操作。Map阶段执行4个Operator,按顺序分别是TableScanOperator、SelectOperator、GroupByOperator、ReduceSinkOperator。


          TableScan
            alias: src119
上面这个是TableScanOperator,扫描表src119。
            Select Operator
              expressions:
                    expr: key
                    type: string
                    expr: value
                    type: string
              outputColumnNames: key, value
上面这个是SelectOperator,需要的字段是key和value。
              Group By Operator
                aggregations:
                      expr: count(DISTINCT value)
                bucketGroup: false
                keys:
                      expr: key
                      type: string
                      expr: value
                      type: string
                mode: hash
                outputColumnNames: _col0, _col1, _col2
上面这个是GroupByOperator,执行聚合函数(aggregations)是count(DISTINCT value)。
                Reduce Output Operator
                  key expressions:
                        expr: _col0
                        type: string
                        expr: _col1
                        type: string
                  sort order: ++
                  Map-reduce partition columns:
                        expr: _col0
                        type: string
                  tag: -1
                  value expressions:
                        expr: _col2
                        type: bigint
上面这个是ReduceSinkOperator。

MapRunner读取一条条记录(record),把一条条record传递给Mapper(ExecMapper)处理。
对于一条记录(record):86val_87(处理后key=86,value=val_87,blog上面显示稍微有问题), ExecMper.map 会依次调用TableScanOperator、SelectOperator、GroupByOperator、ReduceSinkOperator的processOp处理这条记录,最后在ReduceSinkOperator的processOp里面 out.collect(keyWritable, value); 收集到MapTask的环形缓冲区(circle buffer)里。(out是OutputCollector),OutputCollector.collect可以参考http://caibinbupt.iteye.com/blog/401374。

  
      Reduce Operator Tree:  // reduce阶段
        Group By Operator
          aggregations:
                expr: count(DISTINCT KEY._col1:0._col0)
          bucketGroup: false
          keys:
                expr: KEY._col0
                type: string
          mode: partials
          outputColumnNames: _col0, _col1
          File Output Operator
            compressed: false
            GlobalTableId: 0
            table:
                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
上面的 Reduce Operator Tree: 说明这个是MapReduce job在Reduce阶段执行的操作。

Reduce阶段执行Group By Operator(GroupByOperator)和File Output Operator(FileSinkOperator)

        Group By Operator
          aggregations:
                expr: count(DISTINCT KEY._col1:0._col0)
          bucketGroup: false
          keys:
                expr: KEY._col0
                type: string
          mode: partials
          outputColumnNames: _col0, _col1
上面这个是GroupByOperator

          File Output Operator
            compressed: false
            GlobalTableId: 0
            table:
                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
上面这个是FileSinkOperator

ReduceTask.run里面
      while (values.more()) {
        reduceInputKeyCounter.increment(1);
        reducer.reduce(values.getKey(), values, collector, reporter);
        if(incrProcCount) {
          reporter.incrCounter(SkipBadRecords.COUNTER_GROUP,
              SkipBadRecords.COUNTER_REDUCE_PROCESSED_GROUPS, 1);
        }
        values.nextKey();
        values.informReduceProgress();
      }
reducer是ExecReducer。

Reduce阶段执行Group By Operator(GroupByOperator)和File Output Operator(FileSinkOperator),Reduce对于每条record(key value对)执行一次GroupByOperator.processOp,当处理了一定的记录后(默认是1000),需要flush一次,flush是调用FileSinkOperator写入HDFS。最后Reduce.close的时候会顺序调用各个operator的close。顺序是因为这些opeator之间是父子关系。所以最后GroupByOperator中残留的数据会forward到FileSinkOperator,通过FileSinkOperator写入HDFS。
 
分享到:
评论

相关推荐

    SQL语句性能分析之explain

    为了更好地理解和优化SQL查询,MySQL提供了一个非常有用的工具——`EXPLAIN`。通过在SQL语句前加上`EXPLAIN`关键字,可以详细展示MySQL如何处理查询语句以及如何使用索引来处理这些查询。这有助于我们选择更高效的...

    HIVE-SQL开发规范.docx

    【秘密】Hive SQL 开发规范 Hive作为Hadoop生态系统中的重要组件,为企业提供了对大规模数据集的高效处理和分析能力。它允许用户通过类似于SQL的查询语言(HiveQL)来操作分布式存储的数据,简化了MapReduce编程...

    HiveSQL执行计划详解.pdf

    通过在HiveSQL查询语句前添加`EXPLAIN`关键字,我们可以获得关于查询如何被Hive解释和执行的详细信息。这些信息通常包括但不限于查询的逻辑结构、操作符的执行顺序以及各种优化措施等。 **示例:** ```sql EXPLAIN...

    SQL优化和SQL执行分析工具Explain的使用详解和示例

    - 当`select_type`为`DERIVED`时,表示从`FROM`子句中提取的子查询作为派生表,MySQL会先执行这些子查询并将结果保存在一个临时表中,然后再执行外部查询。 #### 六、总结 通过对Explain工具的使用以及对其返回...

    mysql的explain分析sql语句性能(慢查询和加没加索引)

    MySQL 的 Explain 分析 SQL 语句性能(慢查询和加没加索引) MySQL 的 Explain 分析 SQL 语句性能是数据库性能优化的重要工具之一。通过 Explain 命令可以分析 SQL 语句的执行计划,了解 SQL 语句的执行过程,找出...

    Hive on Spark EXPLAIN statement

    Hive on Spark EXPLAIN statement : 讲述了 Common Join / Map join / Bucket Map Join / Sorted Merge Bucket Map Join / skew join 在explain 中的 树结构 。In Hive, command EXPLAIN can be used to show the ...

    102 透彻研究通过explain命令得到的SQL执行计划(3).pdf

    在给出的文档内容中,通过分析一个包含子查询的SQL语句的执行计划,我们可以看到如何通过explain命令去分析复杂的SQL查询。文档中展示了执行计划中包含的各个字段的含义,例如id、select_type、table、partitions、...

    100 透彻研究通过explain命令得到的SQL执行计划(1).pdf

    在使用MySQL数据库时,explain命令是一个非常重要的工具,它可以帮助开发者理解MySQL优化器是如何执行一个给定的SQL查询语句的。通过分析执行计划,开发者可以更深入地了解查询性能,从而对SQL语句进行优化。本文将...

    explain分析sql脑图

    explain分析sql具体字段含义脑图

    ORACLE EXPLAIN PLAN的总结

    这将把执行计划存储到一个名为“TABLE”或自定义的表中。 2. 观察执行计划:使用SELECT * FROM TABLE(ANALYZE PLAN)或DBMS_XPLAN.DISPLAY来查看存储的执行计划。 三、执行计划的输出 1. Operation:操作类型,如...

    105 透彻研究通过explain命令得到的SQL执行计划(6).pdf

    在数据库管理和优化中,通过EXPLAIN命令获取的SQL执行计划是数据库性能分析和SQL语句优化的重要依据。本篇详细讲解了EXPLAIN...对于任何针对数据库性能调优和SQL语句优化的实践,EXPLAIN命令都是一个不可或缺的工具。

    Ruby-这个gem自动记录每个查询的SQLEXPLAIN

    `activerecord-explain` gem 是一个ActiveRecord的扩展,它集成到了Rails应用中,当启用时,每次执行的SQL查询都会被记录并附带其EXPLAIN计划。EXPLAIN计划是数据库管理系统提供的一种工具,用于显示查询执行的详细...

    Oracle中explain_plan的用法

    Oracle 中的 explain_plan 是一个强大的分析工具,能够帮助用户了解 SQL 语句的执行计划,通过它可以了解 Oracle 是如何连接表、使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。下面详细讲解 ...

    Python-djangoexplain一个助手用于djangoqueryset取得EXPLAIN或EXPLAINANALYZEOUTPUT

    `django-explain`是一个针对Django框架的辅助工具,专门用来获取Django queryset执行的`EXPLAIN`或`EXPLAIN ANALYZE`输出,以便于开发者进行数据库性能分析。 `EXPLAIN`命令在数据库中用于显示查询的执行计划,它...

    106 透彻研究通过explain命令得到的SQL执行计划(7).pdf

    在研究SQL语句的执行计划时,"explain命令"是一个非常重要的工具。通过explain命令可以得到SQL语句的执行计划,从而帮助我们了解SQL语句是如何被执行的。执行计划里面包含了多个字段,这些字段共同描述了查询的各个...

    hive高级分析函数与优化.rar_hive_hive 函数优化_hive 分析 大数据_hive高级优化_oldwlc

    在大数据分析领域,Hive作为一个基于Hadoop的数据仓库工具,被广泛用于处理和分析大规模数据。本资料主要探讨Hive的高级分析函数及其优化技术,旨在帮助用户更高效地利用Hive进行大数据处理。以下是对标题和描述中...

    104 透彻研究通过explain命令得到的SQL执行计划(5).pdf

    通过对EXPLAIN命令返回的执行计划进行分析,可以有效地识别和解决性能问题,这对于数据库管理员和开发人员来说是一个必须掌握的技能。在实际操作中,不断地复习和应用这些知识点将能够显著提高我们对数据库操作的...

    mysql+explain实例分析

    当我们运行一个`EXPLAIN`命令时,会得到以下几列信息: 1. **id**:查询的序列号,表示查询中子句的顺序。 2. **select_type**:查询类型,如SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等。 3. **...

    Oracle中EXPLAIN PLAN的使用技巧

    最后,EXPLAIN PLAN 是一个非常有用的工具,能够提供有用的信息,帮助用户有效地调整自己的语句。通过使用 EXPLAIN PLAN,可以免去很多推测,提高查询性能。 EXPLAIN PLAN 是 Oracle 中一个非常重要的诊断工具,...

Global site tag (gtag.js) - Google Analytics