HiveSQL执行计划解读-查看扩展/依赖信息
ninehua 2025-06-13 15:51 22 浏览
今天我们继续HiveSQL执行计划的学习。在学习之前我们先复习之前:
回顾完之前的文章,我们继续解读SQL执行计划的扩展和依赖信息,即:
- explain extended
- explain dependency
查看执行计划的扩展信息
explain extended顾名思义就是对explain的扩展,打印的信息会比explain更加丰富,包含三个部分:
第一部分:抽象语法树(ABSTRACT SYNTAX TREE,简称AST):是SQL转换成MapReduce或其它计算引擎的任务中的一个过程。在Hive 3.0版本,AST会从explain extended的移除,要查看AST,需要使用explain ast的命令。
第二部分:作业的依赖关系图,即STAGE DEPENDENCIES,其内容和explain所展现的一样,不做重复介绍。
第三部分:每个作业的详细信息,即STAGE PLANS,在打印每个作业详细信息时,explain extend会打印出更多的信息,除了explain打印出的内容,还包括每个表的HDFS读取路径,每个Hive表的表配置信息等。
查看SQL数据输入依赖的信息
explain dependency用于描述一段SQL需要的数据来源,输出是一个json格式的数据,里面包含两个部分:
第一部分:input_partitions:描述一段SQL依赖的数据来源表分区,里面存储的是分区名的列表,格式如下:
{"partitionName":"库名@表名 @分区列=分区列的值"}
如果整段SQL包含的所有表都是非分区表,则显示为空。
第二部分:input_tables:描述一段SQL依赖的数据来源表,里面存储的是Hive表名的列表,格式如下:
{"tablename":"库名@表名 ","tabletype":表的类型(外部表/内部表)"}
下面看两个案例,案例6.3是查询非分区普通表SQL的explain dependency,案例6.4时查询分区表SQL的explain dependency
案例6.3 使用explain dependency查看SQL查询非分区普通
--业务逻辑同案例6.1
explain dependency
select s_age,count(1) num from student_tb_orc
where s_age<30 and s_name like '%红%'
group by s_age;
输出结果如下:
{"input_partitions":[],"input_tables":[{"tablename":"default@student_tb_orc","tabletype":"MANAGED_TABLE"}]}
案例6.4 使用explain denpendency查看SQL查询分区表
--业务逻辑同案例6.1
explain dependency
select s_age,count(1) num from student_orc_partition
where s_age<30 and s_name like '%红%'
group by s_age
输出结果如下:
{"input_partitions":[{"partitionName":"default@student_orc_partition@part=0"},
{"partitionName":"default@student_orc_partition@part=1"},
{"partitionName":"default@student_orc_partition@part=2"},
{"partitionName":"default@student_orc_partition@part=3"},
{"partitionName":"default@student_orc_partition@part=4"},
{"partitionName":"default@student_orc_partition@part=5"},
{"partitionName":"default@student_orc_partition@part=6"},
{"partitionName":"default@student_orc_partition@part=7"},
{"partitionName":"default@student_orc_partition@part=8"},
{"partitionName":"default@student_orc_partition@part=9"}],
"input_tables":[{"tablename":"default@student_orc_partition","tabletype":"MANAGED_TABLE"}]
explain dependency使用场景:
场景一:快速排错。快速排除因为读取不到相应分区的数据导致任务数据输出异常的情况。例如,在一个以天分区任务中,上游任务因为生产过程不可控因素导致出现异常或者出现空跑,导致下游任务引发异常。通过这种方式,可以快速查看SQL读取的分区,是否出现异常。
场景二:帮助理清表的输入,帮助理解程序的运行,特别是有助于理解有多重数据查询,多表连接的依赖输入。
下面通过两个案例来看explain dependency的实际运用。在案例6.5中,我们会通过explain dependency识别看似等价的代码实际不等价。对于刚接触SQL的人,很容易将“select * from a inner join b on a.no=b.no and a.f>1 and a.f<3”这种写法等价于“select * from a inner join b on a.no=b.no where a.f>1 and a.f<3”这种写法,我们可以通过案例6.5,来查看下它们的区别。
案例6.5 通过explain dependency识别看似等价的代码
--代码片段1
select a.s_no
from student_orc_partition a
inner join student_orc_partition_only b
on a.s_no=b.s_no and a.part=b.part and a.part>=1 and a.part<=2
--代码片段2
select a.s_no
from student_orc_partition a
inner join student_orc_partition_only b
on a.s_no=b.s_no and a.part=b.part
where a.part>=1 and a.part<=2
下面分别是上面两代码片段explain dependency输出结果:
--代码片段1的explain dependency打印结果:
{"input_partitions":
[{"partitionName":"default@student_orc_partition@part=0"},
{"partitionName":"default@student_orc_partition@part=1"},
{"partitionName":"default@student_orc_partition@part=2"},
{"partitionName":"default@student_orc_partition_only@part=1"},
{"partitionName":"default@student_orc_partition_only@part=2"}],
"input_tables":
[{"tablename":"default@student_orc_partition","tabletype":"MANAGED_TABLE"},
{"tablename":"default@student_orc_partition_only","tabletype":"MANAGED_TABLE"}]}
--代码片段2的explain dependency打印结果:
{"input_partitions":
[{"partitionName":"default@student_orc_partition@part=1"},
{"partitionName" : "default@student_orc_partition@part=2"},
{"partitionName" :"default@student_orc_partition_only@part=1"},
{"partitionName":"default@student_orc_partition_only@part=2"}],
"input_tables":
[{"tablename":"default@student_orc_partition","tabletype":"MANAGED_TABLE"},
{"tablename":"default@student_orc_partition_only","tabletype":"MANAGED_TABLE"}]}
通过上面我们可以其实上述的两SQL并不等价,在内连接(inner join)中的连接条件中加入非等值的过滤条件,并没法将内连接的左右两表按照过滤条件进行过滤,内连接在执行时候会多读取part=0的分区数据。
explain dependency可以帮助纠正错误的认知。大部分SQL的学习者,在学习外连接,包括左外连接、右外连接、全外连接,如果不细抠概念,很容易将下面案例6.6中两种情况进行搞混。
案例6.6 使用explain dependency识别SQL读取数据范围差别
---代码片段1
explain dependency
select a.s_no
from student_orc_partition a
left outer join student_orc_partition_only b
on a.s_no=b.s_no and a.part=b.part and b.part>=1 and b.part<=2;
---代码片段2
explain dependency
select a.s_no
from student_orc_partition a
left outer join student_orc_partition_only b
on a.s_no=b.s_no and a.part=b.part and a.part>=1 and a.part<=2;
在使用过程,容易认为代码片段2可以像代码片段1一样进行数据过滤,通过查看explain dependency输出结果,可以知道不是如此。
下面是代码片段1和2的explain dependency输出结果:
--代码片段1的打印结果
{"input_partitions":
[{"partitionName": "default@student_orc_partition@part=0"},
{"partitionName":"default@student_orc_partition@part=1"},
…中间省略7个分区
{"partitionName":"default@student_orc_partition@part=9"},
{"partitionName":"default@student_orc_partition_only@part=1"},
{"partitionName":"default@student_orc_partition_only@part=2"}],
"input_tables":
[{"tablename":"default@student_orc_partition","tabletype":"MANAGED_TABLE"},
{"tablename":"default@student_orc_partition_only","tabletype":"MANAGED_TABLE"}]}
--代码片段2的打印结果
{"input_partitions":
[{"partitionName":"default@student_orc_partition@part=0"},
{"partitionName":"default@student_orc_partition@part=1"},
…中间省略7个分区
{"partitionName":"default@student_orc_partition@part=9"},
{"partitionName":"default@student_orc_partition_only@part=0"},
{"partitionName":"default@student_orc_partition_only@part=1"},
..中间省略7个分区
{"partitionName":"default@student_orc_partition_only@part=9"}],
"input_tables":
[{"tablename":"default@student_orc_partition","tabletype":"MANAGED_TABLE"},
{"tablename":"default@student_orc_partition_only","tabletype":"MANAGED_TABLE"}]}
我们可以看到对左外连接在连接条件中加入非等值过滤过滤的条件,如果过滤条件是作用于右表(b表)有起到过滤的效果,右表只要扫描两分区,但是左表(a表)会进行全表扫描。如果过滤条件是针对左边的表,则完全没有起到过滤的作用,两个表进行全表扫描。这时的情况就如全外连接一样都需要对两个数据进行全表扫描。
扩展:如果要使用外连接并需要对左右两表进行条件过滤,最好的方式就是将过滤条件放到表的就近处,即如果已经知道表数据过滤筛选条件,那么在使用该表前,就用该过滤条件进行过滤,一些SQL内置优化器的也会做上述的优化,但是我们还是建议按上面介绍的方式写出来。例如将代码片段2改写成如下案例6.7形式,即在使用表数据之前尽可能过滤掉不需要的数据:
案例6.7 尽早过滤掉不需要的数据
select a.s_no
from (
select s_no,part
from student_orc_partition
--在自查询内部进行过滤
where part>=1 and part<=2
) a
left outer join student_orc_partition_only b
on a.s_no=b.s_no and a.part=b.part ;
相关推荐
- 从零开始做数据产品经理06-数据中台怎么建,该如何设计
-
别急着“从0到1”搭数据中台!作者亲身踩坑记录:先让业务用起来,再反向迭代,才是小团队也能活下来的中台建设心法。开头声明:不是大厂中台产品专家,但是我的中台经历丰富我不是做过完整数据中台的大牛,也没带...
- 救命!事情多到做不完?这个“三件事”法则让你瞬间清爽!
-
你是不是也这样?每天被聊天软件、微信的红点轰炸,手头上的活儿像俄罗斯方块一样,刚消掉一个,立马又掉下来三个,一天下来累得像条牛马,结果回头一看,好像啥也没干成。好家伙,我刚入职那会儿就是这个状态。那段...
- 电脑重装系统全攻略:从入门到避坑
-
一、系统选择与准备阶段(1)主流系统类型解析Windows阵营:Win10兼容性强(推荐21H2版)、Win11需TPM2.0支持macOS系统:需通过恢复模式在线安装,仅限苹果设备Linux...
- 显示类故障
-
继续讲显示器问题,我太清楚显示类故障有多让人抓狂了——开机黑屏以为显示器坏了,结果是显卡松了;调分辨率总花屏,折腾半天才发现驱动没装好。,结合我的经历,来跟大家唠唠显示类故障的排查思路和避坑技巧。...
- 【2025最新】VMware 虚拟机配置与安装VMware Tools 感受它的强大~
-
安装VMwareToolsVMwareTools是什么VMwareTools是VMware虚拟机中自带的一种增强工具,它提供了一系列的功能和性能优化,让我们的虚拟机可以在VMware虚拟化平台上...
- 十年以上旧电脑装什么系统
-
根据搜索结果,十多年的旧电脑在选择操作系统时需重点考虑硬件配置、兼容性及安全性。以下是综合各来源的推荐及注意事项:一、系统推荐1.Windows7(精简版/企业版)-适用场景:硬件配置较低(...
- 分享一下我是如何快速安装系统和软件的
-
快速安装系统和软件。分享一下我是如何只需要花几分钟时间就可以给这台新电脑装上系统和软件。·首先把这台新电脑的硬盘拆下来,然后把硬盘装到硬盘盒里面,转成USB接口接到这台台式电脑上。这台电脑上面安装了一...
- 2025装机必备:这5款纯净版PE工具,让你的电脑维护轻松又高效!
-
大家好,我是随性自由的清泉,一个在装机行业摸爬滚打了20年的老江湖。今天,我来给大家分享一些干货。如果你也像我一样,经常被电脑问题搞得焦头烂额,那你一定知道,一个好用的PE工具有多重要。今天,我就来给...
- 格里格音乐厅——雨后印象
-
由专筑网马邦俊,刘庆新编译TamasMdeve对于挪威卑尔根Griehallen在冷雨天回忆的图片,以极好的合成技巧与氛围的把控令我们如同身临其境一样,就像与他站在这座音乐厅旁,同时这也让他荣获Ro...
- 3ds Max安装指南:详细步骤与常见错误避免
-
3dsMax是Autodesk旗下的专业3D建模、动画和渲染软件,广泛应用于游戏、影视和建筑可视化领域。安装过程虽然不算复杂,但新手可能会遇到一些问题。---##**一、安装前的准备工作...
- 3dsMax2026安装和激活教程
-
3dsMax是由Autodesk公司推出的专业三维建模、动画与渲染软件,广泛用于建筑可视化、游戏开发、影视特效及工业设计等多个领域。它提供从基础建模到高级渲染的完整工具链,支持多边形建模、NURB...
- 网站安全再升级:密码+邮箱验证码双因验证的实战解析
-
欢迎关注我,阅读更多Dreamweaver可视化编程设计网站的内容。在互联网时代,用户账户的安全性至关重要。随着网络攻击手段的不断进化,传统的“用户名+密码”登录方式已经难以应对日益复杂的网络安全...
- 爷青回!经典老牌音乐播放器Winamp宣布回归
-
据媒体爆料称:近期,老牌音乐播放器Winamp宣布回归,官方网站也大改后重新上线。官方表示:不只是简单更新而是全面重制。新的Winamp将推出适用于Windows、macOS和移动平台的多合一应...
- 推荐一款开源的macOS视频播放神器,功能太强悍了
-
关注公众号“OpenSourceDaily”,每天推荐给你优秀开源项目Windows有不少全能的影音播放器可以选择,相较之下macOS好像就少了一些,今天,就和大家分享一个强大到爆炸的macOS...
- Boom for iOS,你不会想到,你 iPhone 的音质可以如此好丨App+1
-
iOS上所谓音质增强App我断断续续试过好几款,最终都由于疗效不显著或是颜值不高等原因而弃用。之前我在Mac上倒是用了Boom2好些日子,效果和颜值都很满意,使用Mac听歌的次数也随...