Hive的SQL优化
--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)