HiveQL逻辑执行顺序

FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

Hive总是按照从左到右的顺序执行的,如a、b、c三个表关联

select a.id,b.colname,c.colname from a join b on a.id = b.id join c on a.id = c.id
大多数情况下,hive会对每个join连接对象启动一个MapReduce任务,上面的列子首先会启动一个MapReduce job对表a和表b进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表c进行连接操作。当对3个或以上的表进行join连接时,如果每个on子句都使用相同的连接键,那么只会产生一个MapReduce job。
因此对于有join的操作要特别注意:
将数据量小的表放在join的左边,保证查询中表的大小从左到右是依次增加的。
普通的join操作,会在map端根据key的hash值,shuffle到某一个reduce上去,在reduce端做join连接操作,内存中缓存join左边的表,遍历右边的表

Oracle、SQL Server中SELECT的列别名只有ORDER BY可以用
HiveSQL基于MySQL存储的元数据信息,HAVING后可使用SELECT指定的别名
逻辑执行顺序:

1.FROM <left_table>
3.<join_type> JOIN <right_table> 2.ON <join_condition>
4.WHERE <where_condition>
5.GROUP BY <group_by_list>
6.WITH {cube|rollup}
7.HAVING <having_condition>
8.SELECT 9.DISTINCT 11.<top_specification> <select_list>
10.ORDER BY <order_by_list>
---------------------------------------------------------------------------------------------------------------------------

1.FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1
2.ON:对vt1表应用ON筛选器只有满足<join_condition>为真的行才被插入vt2
3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 
生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束
4.WHERE:对vt3应用 WHERE 筛选器只有使<where_condition>为true的行才被插入vt4
5.GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5
6.CUBE|ROLLUP:把超组(supergroups)插入vt6 生成vt6
7.HAVING:对vt6应用HAVING筛选器只有使<having_condition>为true的组才插入vt7
8.SELECT:处理select列表产生vt8
9.DISTINCT:将重复的行从vt8中去除产生vt9
10.ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10
11.TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者
--SQLServer中支持Values claues With table constructor,返回结果200
SELECT ROUND((100*(100000/new.uv))-100,4) AS rate FROM (VALUES(32525))new(uv)
SELECT ROUND((100*(100000/32525))-100,4) AS rate
--Hive中不支持Values claues With table constructor
FAILED: SemanticException [Error 10296]: Values clause with table constructor not yet supported
--用实际值测试返回结果207.4558,相比SQLServer不需要显式整型的转换了
SELECT ROUND((100*(100000/32525))-100,4) AS rate

HiveQL逻辑执行顺序 - 博客园


<think>好的,我需要帮助用户了解Hive的执行流程。首先,我需要回忆一下Hive的基本概念和工作原理。Hive是基于Hadoop的数据仓库工具,允许用户通过类SQL的HiveQL语言进行数据查询和分析,底层会将查询转换为MapReduce任务执行。 根据用户提供的引用内容,特别是引用[2]提到Hive的核心功能包括ETL、数据查询等,且使用MapReduce。而引用[4]详细列出了Hive的工作流程步骤,包括从驱动接收查询到最终返回结果的过程。还有引用[3]提到可以通过EXPLAIN查看执行计划,这可能在流程中涉及解析和优化阶段。 用户的问题是关于Hive执行流程的详解,所以需要分步骤解释。首先应该从用户提交查询开始,接着到驱动程序的解析,生成执行计划,编译优化,转换成MapReduce任务,资源申请,任务执行,最后结果返回。每个步骤需要结合引用的内容,比如引用[4]中的发送结果至driver和interface,引用[1]中提到的执行顺序的重要性。 另外,需要确保回答结构清晰,分点说明,并正确引用来源。例如,在解释执行计划生成时引用[3],在提到结果返回阶段引用[4]。同时,生成的相关问题需要与Hive执行流程相关,如优化方法、执行计划分析等,参考用户提供的示例中的相关问题结构。 需要注意使用中文,避免使用Markdown格式,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,主要是流程步骤。还要检查LaTeX语法是否正确,虽然可能用不上太多数学表达式。 最后,确保回答真实可靠,依据提供的引用内容,并且自然地添加引用标识。例如,在提到执行引擎发送结果时引用[4],在解析和优化阶段引用[3]。 现在整理成结构化的回答,分步骤详细说明Hive的执行流程,并附上相关问题。</think>Hive的执行流程详解如下,结合其核心组件和工作原理分步骤说明: --- ### 一、Hive执行流程分步解析 1. **用户提交查询** 用户通过CLI、JDBC/ODBC接口或Web UI提交HiveQL查询语句,例如`SELECT * FROM table WHERE condition`[^2]。 2. **驱动接收并解析查询** 驱动程序(Driver)接收查询后,通过**解析器(Parser)**进行语法和语义分析,生成抽象语法树(AST)。若使用`EXPLAIN`命令可查看执行计划细节[^3]。 3. **编译器生成逻辑计划** 编译器将AST转换为逻辑执行计划(Query Block),并进一步优化为操作符树(Operator Tree)。此阶段涉及表结构和分区的元数据验证(通过Metastore)[^4]。 4. **优化器优化执行计划** 优化器对逻辑计划进行优化,包括: - **谓词下推**(提前过滤数据) - **Join优化**(如Map Join或Reduce Join选择) - **分区裁剪**(减少数据扫描量) 5. **生成物理计划(MapReduce任务)** 编译器将优化后的逻辑计划转换为物理计划,即具体的MapReduce任务或Tez任务。例如,`GROUP BY`会生成Reduce阶段的任务。 6. **执行引擎提交任务** 执行引擎(如MapReduce引擎)向资源管理器(YARN)申请资源,并将任务分发到集群节点执行。此阶段涉及: - **Map阶段**:数据读取、过滤、局部聚合 - **Shuffle阶段**:数据按Key分区排序 - **Reduce阶段**:全局聚合或Join操作 7. **结果返回与输出** 执行引擎将最终结果返回给驱动程序,驱动程序再将结果发送至用户接口。若查询包含`INSERT`语句,结果会写入HDFS指定路径。 --- ### 二、关键组件协作 - **Metastore**:存储表结构、分区等元数据,供解析和优化阶段使用[^2]。 - **HDFS**:存储实际数据,执行引擎读取数据时依赖其分布式存储能力。 - **资源管理器(YARN)**:分配计算资源,确保任务高效执行[^4]。 --- ### 三、示例:简单查询的执行流程 以`SELECT name, COUNT(*) FROM user WHERE age > 30 GROUP BY name`为例: 1. 解析器验证语法并生成AST。 2. 优化器将`WHERE age > 30`下推至数据扫描阶段。 3. 编译器生成Map阶段(过滤age)和Reduce阶段(按name聚合)。 4. 执行引擎运行任务,最终返回分组统计结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值