Hive SQL语句的正确执行顺序

news2025/1/11 0:01:58

关于 sql 语句的执行顺序网上有很多资料,但是大多都没进行验证,并且很多都有点小错误,尤其是对于 select 和 group by 执行的先后顺序,有说 select 先执行,有说 group by 先执行,到底它俩谁先执行呢?

今天我们通过 explain 来验证下 sql 的执行顺序。

在验证之前,先说结论,Hive 中 sql 语句的执行顺序如下:

from … where … join … on … select … group by … select … having … distinct … order by … limit … union/union all

可以看到 group by 是在两个 select 之间,我们知道 Hive 是默认开启 map 端的 group by 分组的,所以在
map 端是 select 先执行,在 reduce 端是 group by 先执行。

下面我们通过一个 sql 语句分析下:

select
  sum(b.order_amount) sum_amount,
  count(a.userkey) count_user
from user_info a
left join user_order b
  on a.idno=b.idno
where a.idno > '112233'
group by a.idno
  having count_user>1
limit 10;

上面这条 sql 语句是可以成功执行的,我们看下它在 MR 中的执行顺序:

Map 阶段:

  1. 执行 from,进行表的查找与加载;

  2. 执行 where,注意:sql 语句中 left join 写在 where 之前的,但是实际执行先执行 where 操作,因为
    Hive 会对语句进行优化,如果符合谓词下推规则,将进行谓词下推;

  3. 执行 left join 操作,按照 key 进行表的关联;

  4. 执行输出列的操作,注意: select 后面只有两个字段(order_amount,userkey),此时 Hive
    是否只输出这两个字段呢,当然不是,因为 group by 的是 idno,如果只输出 select 的两个字段,后面 group by
    将没有办法对 idno 进行分组,所以此时输出的字段有三个:idno,order_amount,userkey;

  5. 执行 map 端的 group by,此时的分组方式采用的是哈希分组,按照 idno 分组,进行 order_amount 的 sum
    操作和 userkey 的 count 操作,最后按照 idno 进行排序(group by 默认会附带排序操作);

Reduce 阶段:

  1. 执行 reduce 端的 group by,此时的分组方式采用的是合并分组,对 map 端发来的数据按照 idno 进行分组合并,同时进行聚合操作 sum(order_amount)和 count(userkey);

  2. 执行 select,此时输出的就只有 select 的两个字段:sum(order_amount) as sum_amount,count(userkey) as count_user;

  3. 执行 having,此时才开始执行 group by 后的 having 操作,对 count_user 进行过滤,注意:因为上一步输出的只有 select 的两个字段了,所以 having 的过滤字段只能是这两个字段;

  4. 执行 limit,限制输出的行数为 10。

上面这个执行顺序到底对不对呢,我们可以通过 explain 执行计划来看下,内容过多,我们分阶段来看。

首先看下 sql 语句的执行依赖:
在这里插入图片描述
我们看到 Stage-5 是根,也就是最先执行 Stage-5,Stage-2 依赖 Stage-5,Stage-0 依赖 Stage-2。

首先执行 Stage-5:
在这里插入图片描述
图中标 ① 处是表扫描操作,注意先扫描的 b 表,也就是 left join 后面的表,然后进行过滤操作(图中标 ② 处),我们 sql 语句中是对 a 表进行的过滤,但是 Hive 也会自动对 b 表进行相同的过滤操作,这样可以减少关联的数据量。

接下来执行 Stage-2:

首先是 Map 端操作:

在这里插入图片描述
先扫描 a 表(图中标 ① 处);接下来进行过滤操作 idno > ‘112233’(图中标 ② 处);然后进行 left join,关联的 key 是 idno(图中标 ③ 处);执行完关联操作之后会进行输出操作,输出的是三个字段,包括 select 的两个字段加 group by 的一个字段(图中标 ④ 处);然后进行 group by 操作,分组方式是 hash(图中标 ⑤ 处);然后进行排序操作,按照 idno 进行正向排序(图中标 ⑥ 处)。

然后是 Reduce 端操作:

在这里插入图片描述
首先进行 group by 操作,注意此时的分组方式是 mergepartial 合并分组(图中标 ① 处);然后进行 select 操作,此时输出的字段只有两个了,输出的行数是 30304 行(图中标 ② 处);接下来执行 having 的过滤操作,过滤出 count_user>1 的字段,输出的行数是 10101 行(图中标 ③ 处);然后进行 limit 限制输出的行数(图中标 ④ 处);图中标 ⑤ 处表示是否对文件压缩,false 不压缩。

执行计划中的数据量只是预测的数据量,不是真实运行的,所以数据可能不准!

最后是 Stage-0 阶段:

在这里插入图片描述
限制最终输出的行数为 10 行。

总结

通过上面对 SQL 执行计划的分析,总结以下几点:

  1. 每个 stage 都是一个独立的 MR,复杂的 hive sql 语句可以产生多个 stage,可以通过执行计划的描述,看看具体步骤是什么。

  2. 对于 group by 的 key,必须是表中的字段,对于 having 的 key,必须是 select 的字段。

  3. order by 是在 select 后执行的,所以 order by 的 key 必须是 select 的字段。

  4. select 最好指明字段,select * 会增加很多不必要的消耗(CPU、IO、内存、网络带宽)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/558716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能结构诊断器:建筑结构健康的守护者

近年来,接二连三的自建房坍塌,超高层建筑震动,让建筑的健康和安全性成为了人们关注的焦点。为了确保建筑物的长期稳定性和安全性,迫切需要高效且准确的方法来监测结构的健康状况。智能结构诊断器的出现,让建筑结构监测…

大数据如何助力营销(5)活动复盘

在市场竞争日益激烈的今天,营销活动已经成为吸引用户、提升品牌影响力、增加销售转化的重要手段。然而,一场营销活动在举办后,往往难以评估活动的效果,而大数据技术将从方方面面、科学有效地复盘活动,并为下一次举办活…

chatgpt赋能Python-python_kbhit

Python kbhit - 帮助您掌握实时按键输入 如果您需要使用实时按键输入来控制您的Python程序,那么你需要知道的是Python kbhit。kbhit是一种允许用户实时按键输入并立即响应的技术。本文将介绍Python kbhit的用途和用法,并探讨实时输入如何帮助您掌控程序…

AI绘图学习心得分享-Midjourney绘画AI,让你少走一些弯路

本教程收集于:AIGC从入门到精通教程 AI绘图学习心得分享-Midjourney绘画AI,让你少走一些弯路 本篇没有什么长篇大论,全部都是实用心得总结。接下来,我们将分享关于Midjourney绘画AI的实用心得总结,包括构图指令结构、常用指令、操作技巧、常用风格词汇和构图词汇。 如果…

手机号码在网时长 API 实现广告投放和精准营销案例分析

引言 手机在网时长是指用户在移动网络上的在线时间,包括用户接入网络的时间和断开网络的时间。手机在网时长 API 是一种提供手机在网时长数据的编程接口,为开发者和服务提供商提供了获取和利用这些数据的能力。 本文旨在深入探讨手机在网时长 API 的技…

计算机视觉——day95 PANet:基于样本原型对齐的Few-Shot图像语义分割

PANet:基于样本原型对齐的Few-Shot图像语义分割 1. Introduction2. Related workFew-shot segmentation 3. Method3.1. Problem setting3.2. Method overview3.3. Prototype learning(原型学习)3.4. 非参数度量学习3.5. 原型对准正则化(PAR) 4. Experime…

MySQL高级 之 explain执行计划详解

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。 explain执行计划包含的信息 其中最重要的字段为:id、type、key、rows、Extra 各字段详解 id select查询的序…

前端安全和防护:如何保护网站和用户信息的安全

第一章:引言 在当今数字化时代,随着互联网的飞速发展,网站已成为人们获取信息和进行交流的主要渠道。然而,随之而来的是对网站安全的日益关注。作为前端开发者和网站管理员,我们有责任确保用户的信息和网站的安全。本…

可分析表情和情绪的轻量化眼镜:Emteq OCOsense解析

近年来,越来越多VR头显开始尝试结合眼球追踪、手势追踪等生物识别技术,甚至在一些VR社交场景,也在探索将Avatar与面部识别功能结合。可以想象,未来生物识别与AR/VR等穿戴技术的关系将越来越紧密,尽管现阶段相关硬件在体…

Jenkins安装插件教程 牢记 Jenkis安装插件(plugin)的两种方法

目录 jenkins在线安装组件(plugin) jenkins离线安装组件(plugin) 前言:在jenkins学习使用或使用的过程中,由于网络的问题,在选择安装插件的时候,会出现某些插件安装失败。这是需要…

Word控件Spire.Doc 【列表】教程:在 Word 文档中插入列表

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

【MaxCompute】基于Package跨项目访问资源实践

背景 目前随着公司业务的不断扩展,各个业务线的数据也越来越多,如果所有数据都集中管理比较错综复杂。MaxCompute的跨项目访问资源比较适合这样的场景。每个业务线创建对应的project,自行管理数据。如果有需要访问其他业务线数据的诉求&…

python3 爬虫相关学习6:html 和 css 简要回顾

因为要学爬虫,需要了解下html内容,我之前大概看过,这算是回顾下 以下html简单回顾内容,跟着这个地址的教程看了一遍,感谢 https://www.w3school.com.cn/html/html_jianjie.asp 下面是笔记 目录 1 html 2 常用标签…

文件缓冲区概念和磁盘的存储原理以及软硬链接

目录 缓冲区 缓冲区执行概念 C语言缓冲区存在于FILE结构体中 用户缓冲区刷新到OS缓冲区的策略 发生重定向 redir未重定向。 redir重定向。 磁盘的存储原理 细讲: Inode table Date block Inode bitmap Block bitmap Group Descriptor Table super Block 在目录…

脑机接口科普0020——是否鸡娃

本文禁止转载!!!! 现在有很多人开始给小孩早教,鸡娃,幼儿园就开始学英语,小学就开始学初中的内容,初中就开始学高中的内容。高中后开始拼命的做卷子,准备考大学,考完大学放纵。大学毕业后失业。 关于是否…

Matlab进阶绘图第21期—三角方块热图

三角方块热图,顾名思义,就是仅保留方块热图数据矩阵的上三角或下三角部分。 三角方块热图简单明了,通过不同颜色、不同大小的圆形表示数据的大小,可以更加直观地对矩阵数据进行可视化表达。 本文使用自制的trisquareheatmap小工…

ERROR: slow sql .. millis.

问题现象 运行过程中,查询页面报错,如下图: 404 NOT FOUND 排查日志,如下图: 查看数据库: 解决办法 在关联字段上添加索引,查询正常。

Linkage Mapper之Pinchpoint Mapper功能解析(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 白尾兔(Lepus townsendii)的Pinchpoint映射器输出和栖息地浓集区效果图: 图片来源地址 <

【CANN训练营0基础赢满分秘籍】应用开发深入讲解→DVPP

1 数据预处理概述 1.1 典型使用场景 受网络结构和训练方式等因素的影响&#xff0c;绝大多数神经网络模型对输入数据都有格式上的限制。在计算视觉领域&#xff0c;这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不—致时…

生命游戏的简单实现(c++代码)

今天上数模课&#xff0c;本来一如既往准备自习&#xff0c;但是&#xff0c;生命游戏——从前就在“人工智能”的书上看到过&#xff0c;今天一讲&#xff0c;发现如此简单。课上30min实现了一份简单的生命游戏代码/ 目录 前言 一、生命游戏 生命游戏的基本设置 生命游戏的规则…