百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

HiveSQL执行计划解读-查看扩展/依赖信息

ninehua 2025-06-13 15:51 8 浏览

今天我们继续HiveSQL执行计划的学习。在学习之前我们先复习之前:

  1. 大数据Hive-SQL执行计划解读(explain)

回顾完之前的文章,我们继续解读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 ;

#Hive# #大数据# #SQL#

相关推荐

免费分享photoshop(cs6+之前的版本快捷键,新版本也适当应用)

这个是cs6(或者cs6之前的版本快捷键,新的版本也适合。)最新的版本能够于设置之中对快捷键予以修改。从事设计工作多年,如今已不再继续,仅整理了部分内容。若有可用之处,您可保存,在此不提供咨询服务!c...

Adobe超强辅助类插件,神器一样的存在

今天给大家带来了一些PS和AI的超强实用插件,都是一些平时设计师能用到的。可以提升不少工作效率,大家千万别错过哦!1PSD、AI缩略图预览插件大小:1.8MB双击安装即可兼容系统:WIN系统32位...

70后郭彩云卸任辽宁省副省长,曾长期在审计系统工作

根据《辽宁日报》5月29日公布的辽宁省人民代表大会常务委员会决定任免名单,郭彩云被免去辽宁省人民政府副省长职务。郭彩云,女,1970年7月出生,山西晋城人,民建会员,经济学硕士,高级审计师、注册会计师...

ThinkPad E531 修改“白名单”刷BIOS及更换网卡详细教程

ThinkPadE531修改“白名单”刷BIOS及更换网卡详细教程最近折腾电脑更换无线网卡的过程中,我就知道了“白名单”这个词.拆机拿掉主板,然后焊下BIOS芯片.通过专业工具修改BIOS芯片里...

一键生成强密码,让密码无懈可击,NAS部署密码生成器『PSWD』

一键生成强密码,让密码无懈可击,NAS部署密码生成器『PSWD』哈喽小伙伴们好,我是Stark-C~我们平时在浏览网站很多时候都要求我们注册账户和密码,有些比较马虎的小伙伴在设置密码的时候怕忘记了,就...

《共鸣:瘟疫传说传承》上架Steam 支持中文配音

《瘟疫传说》系列前传《共鸣:瘟疫传说传承(Resonance:APlagueTaleLegacy)》正式公布,将会登陆PC、XboxSeriesX|S和PS5!该作已上架PCSteam平...

大吃四方!PS Portal已被破解可运行PSP模拟器!玩手游还远吗

根据长期致力于PlayStation的黑客AndyNguyen的说法,他们已经成功破解了索尼云掌机PSPortal,并在上面引入了PPSSPP模拟器,这使得PSPortal可以本地原生运行PSP...

Adobe Substance 3D Painter中文直装版Substance 3D Painter 7.4.1

Substance3DPainter7.4.1是一款由adobe全新推出3D绘画软件,Substance3DPainter拥有为3D资产制作纹理所需的工具,为您提供3D贴图所需的...

《剑星》PC版新增大量限制级皮肤,让mod无路可走

《剑星》被评为是17+的游戏,我一直感觉这个评级是不是稍微太低了一点呢?毕竟不光是那些让人垂涎三尺的mod已经蠢蠢欲动,而且就连《剑星》开发团队ShiftUp也亲自下场打造各种“实实在在”的皮肤了。...

国外一老哥,把iPhone接口改造成了C口,竟卖出55万元

一部二手的iphoneX可以卖到多少钱?答案是:86001美刀!约合55万软妹币!是的,你没有看错,这就是前两天发生的事儿...不过它可不是普通的iphoneX,而是由国外一位大神KenPil...

HiveSQL执行计划解读-查看扩展/依赖信息

今天我们继续HiveSQL执行计划的学习。在学习之前我们先复习之前:大数据Hive-SQL执行计划解读(explain)回顾完之前的文章,我们继续解读SQL执行计划的扩展和依赖信息,即:explain...

CAD是什么?用什么软件打开?(cad是干什么用的?)

CAD是计算机辅助设计(Computer-AidedDesign)的缩写,能够处理DWG文件类的矢量图形格式,但在实际应用中,许多用户因缺乏专业软件或操作复杂而难以高效处理这类文件。元图CAD作为一...

中望CAD块属性导入导出功能提高设计效率

属性块在CAD设计中广泛应用,如工程建筑中的轴号、门窗、水暖电设备,机械制造中的粗糙度符号定制、图框标题栏、明细表等。在全新的中望CAD+平台软件中,块的设计更加灵活,设计师能够迅速地编辑、修改属性块...

专业机械设计软件AutoCAD Mechanical 资源包下载

AutoCADMechanical是由Autodesk公司开发的一款面向机械设计领域的CAD软件。它是基于AutoCAD平台开发的专业机械设计软件,为机械设计师提供了一些特殊的工具和功能,以简化机械...

CAD下载好无法安装怎么办?(cad安装包下载不了)

当下载好的CAD软件无法安装时,可能有几种常见原因,下面是一些解决方法:1.检查系统要求操作系统:确保CAD版本与系统兼容,比如Windows或Mac版本是否支持。硬件配置:查看电脑的内存、CPU和...