Hive的SQL优化

发布时间 2023-04-11 17:17:24作者: 一只小白two

--HiveSQL优化

1.查看执行计划

  --基本信息

  explain select * from part1 where id<10;

  --显示输入属性

  explain dependency

  --查看SQL相关权限信息

  explain authorization

  --查看SQL向量化描述信息,显示为什么未对Map和Reduce进行矢量化

  explain vectorization

  --用实际的行数注释计划

  explain analyze

  --了解系统获得那哪些锁以运行指定查询

  explain locks

2.执行计划详解

--一个Hive查询被转换成一个由一个或多个stage组成的序列(有项无环图DAG)。这些stage可以是MapReduce stage ,也可以是负责元数据存储的stage,也可以是负责文件系统的操作(比如移动和重命名)的stage

--eg:select sun(id) from test1;

  (1)stage dependencies:各个stage之间的依赖

    stage-1是根stage,是开始的stage,stage-0依赖Stage-1,stage-1执行完执行stage-0.

  (2)stage plan;各个stage之间的执行计划

   (2.1)Map Operator Tree:MAP端的计划执行树

        TableScan:表扫描操作,map端第一个操作是加载表

        --alia:表名称

        --Statistics:表统计信息,包括表中数据条数,数据大小等

        Select Operator:选取操作

        --expressions:需要的字段名称及字段类型

        --outputColumnNames;输出的列的名称

        --Statistics:表统计信息,包含表中数据条数,数据大小等

        Group By Operator:分组聚合操作

        --aggregations:显示聚合函数信息

        --mode:聚合模式,值由hash:随机聚合,就是hash partition;partial:局部聚合;final;最终聚合。

        --keys:分组字段,没有分组没有这个字段

        --outputColumnNames:聚合后输出的列名

        --Statistics:表统计信息,包含分组聚合之后的数据条数,数据大小等

        Reduce Output Operator:输出到reduce操作

        --sort order:值为空 不排序;值为+ 正序排序,值为- 倒序排序;值为+-排列的为两列,第一列为正序,第二列为倒序

        Filter Operator:过滤操作

        --predicate;过滤条件,如sql中where id>1,则显示(id>1)

        Map Join Operator:join操作

        --condition map:join方式,如Inner Join 0 to 1 Left Outer Join 0 to 2

        --keys:join的条件字段

        --outputColumnNames:join完成后输出的字段

        --Statistics:join完成后生成的数据条数,大小等

        File Output Operator;文件输出操作

        --compressed:是否压缩

        --table:表信息,包含输入输出文件格式化方式,序列化方式

        Fetch Opertor:客户端获取数据操作

        --limit:值为-1表示不限制条数,其他值为限制条数

   (2.2)Reduce Operator Tree:Reduce端的执行计划树

3.explain dependency的用法

--用于描述一段SQL需要的数据来源,输出是个json格式的数据,里面包含以下内容:

  input_partitions:描述一段SQL依赖的数据来源表分区,里面存储的是分区名的列表,如果整段SQL中包含的表都是非分区表,则显示为空

  input_tables:描述一段SQL依赖的数据来源表,里面存储的是Hive表名的列表

  --使用场景

  (1)快速排除:快速排除因为读取不到相应分区的数据而导致任务数据出现异常。

  (2)理清表输入:帮助程序运行,特别有助于理解多重子查询,多表连接的依赖输出。

4.explain authorization

--可以知道SQL访问的数据来源(INPUTS)和数据输出(OUTPUTS),以及当前Hive的访问用户(CURRENT_USER)和操作(OPERATION)