精华内容
下载资源
问答
  • hive sql语句的执行顺序
    千次阅读
    2022-05-02 11:11:23

    HQL的语句执行顺寻与SQL有一定的差别

    Hive SQL  

    From - where - join - on - select - group by - select - having - distinct - order by - limit - union/union all 

    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。 

    更多相关内容
  • hive sql 语句正确执行顺序

    千次阅读 2021-03-14 16:33:29
    执行顺序:from ..on .. join .. .. where .. select .. group by .. having .. order by... limit ... map阶段 from 加载,进行表的查找和加载 where过滤 select查询 Reduce阶段 group by :对map端发来的文件...

    网上对select group by的执行顺有不同的说法,很容易让人挠头,这里通过代码成功验证 : group by>select

    正确的执行顺序:

    from ..on .. join .. where .. group by .. having .. select .. distinct .. order by .. limit

    案例:

    1.数据原表:

    2.执行sql:

    select
       dt,
       user_id,
       min(age) age,
       rank() over(partition by user_id order by dt) rk
    from
       user_age
    group by
       dt,user_id;

    3.执行结果:

    4.执行顺序详解:

    sql里有分区和分组两种操作,执行顺序不同会导致其结果也不同。其中分区操作为rank() over(partition by user_id order by dt) rk,分组操作为group by dt,user_id。

    由于group by>select,所以先执行group by操作,再执行select操作。

    具体执行步骤:

    步骤1:执行group by dt,user_id,执行结果如下:

    注:group by 后面有两个字段 dt,user_id,表示将这两个字段看成一个整体进行分组。

    步骤2:执行select dt,user_id,min(age) age,rank() over(partition by user_id order by dt) rk

    ①依次执行dt,user_id,min(age) age由于min(age)这里出现聚合,所以会先对表进行聚合,聚合后的结果如下:

    ②接着执行rank() over(partition by user_id order by dt) rk 先根据user_id进行分区,再根据dt进行排序,结果如下:


    由于select后没有其他操作了,所以该表为最终结果。

     

     

    附:执行计划:

    Map Operator Tree:
    TableScan
                alias: 表名   -- 相当于 from ...

    Filter Operator
                  predicate: where中的字段  -- 过滤where字段的条件

    Select Operator
                    expressions: select 中的字段 + 类型type    -- select
                    outputColumnNames: 输出的字段  -- select
    Group By Operator
                      aggregations: 聚合函数 sum(age)/count(age)等 
                      keys: group by 中的字段 + 类型type 
    Reduce Output Operator
                     map端本地的reduce

    Reduce Operator Tree:
    Group By Operator
              aggregations: sum(VALUE._col0)   --reduce 聚合函数 对虚拟列
              keys: KEY._col0 (type: string), KEY._col1 (type: string), KEY._col2 (type: string) 
              mode: mergepartial
                  outputColumnNames: _col0, _col1, _col2, _col3 --为临时结果字段按规则起的临时字段名
    Select Operator
                expressions: _col0 (type: string), _col1 (type: string), _col2 (type: string), _col3 (type: bigint) --select
                outputColumnNames: _col0, _col1, _col2, _col3 -- 输出虚拟列(为临时结果字段按规则起的临时字段名)
                
    File Output Operator
                  compressed: false

     

    展开全文
  • Hive SQL语句的正确执行顺序

    千次阅读 2021-07-28 08:53:16
    关于 sql 语句执行顺序网上有很多资料,但是大多都没进行验证,并且很多都...在验证之前,先说结论,Hivesql 语句执行顺序如下: from .. where .. join .. on .. select .. group by .. select .. having ..

    前言:hive的执行顺序也是总结mapreduce的执行顺序!!!

    关于 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 阶段

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

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

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

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


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

    1.首先看下 sql 语句的执行依赖:

    我们看到 Stage-5 是根,也就是最先执行 Stage-5,Stage-2 依赖 Stage-5,Stage-0 依赖 Stage-2。

    2.首先执行 Stage-5:

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

    3.接下来执行 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 不压缩。

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

    4.最后是 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、内存、网络带宽)。

    展开全文
  • hive sql 语句执行顺序执行计划 hive 语句执行顺序 from... where.... select...group by... having ... order by... 执行计划 Map Operator Tree: TableScan alias: 表名 -- 相当于 from ... Fil...

    hive 语句执行顺序

    from... where.... select...group by... having ... order by...

    执行计划

    Map Operator Tree:
    TableScan
                alias: 表名   -- 相当于 from ...
    
    Filter Operator
                  predicate: where中的字段  -- 过滤where字段的条件
    
    Select Operator
                    expressions: select 中的字段 + 类型type    -- select
                    outputColumnNames: 输出的字段  -- select
    Group By Operator
                      aggregations: 聚合函数 sum(age)/count(age)等 
                      keys: group by 中的字段 + 类型type 
    Reduce Output Operator
                     map端本地的reduce
    
    Reduce Operator Tree:
    Group By Operator
              aggregations: sum(VALUE._col0)   --reduce 聚合函数 对虚拟列
              keys: KEY._col0 (type: string), KEY._col1 (type: string), KEY._col2 (type: string) 
              mode: mergepartial
                  outputColumnNames: _col0, _col1, _col2, _col3 --为临时结果字段按规则起的临时字段名
    Select Operator
                expressions: _col0 (type: string), _col1 (type: string), _col2 (type: string), _col3 (type: bigint) --select
                outputColumnNames: _col0, _col1, _col2, _col3 -- 输出虚拟列(为临时结果字段按规则起的临时字段名)
                
    File Output Operator
                  compressed: false
                  

    未完待续

    posted on 2017-07-12 15:15 姜小嫌 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/jiangxiaoxian/p/7155636.html

    展开全文
  • hive sql语句执行原理

    2020-12-30 15:17:36
    大体理解为:hive会对写好的sql语句进行拆解,按执行顺序拆分红树结构(AST)交给mapreduce处理;htmlhive对不一样DML/DDL关键字有不一样的反应,比较敏感的有select、from、join、group by、distinct、insert等;sql...
  • 提示Hive SQL 教程 编写中,使用过程中有任何建议,提供意见、建议、...虽然表面上是写 sql,但是在从 hivesql,到最终出来执行结果,中间经历了 MR 流程,其中 MR 的 map,combiner,shuffle,reduce 具体是执...
  • hive SQL语句执行过程

    2020-01-09 17:44:28
    hive SQL语句执行过程 背景了解: hive数仓数据存储于Hadoop大数据框架的HDFS文件系统中,以文件的方式存储,hive是建立在Hadoop之上的数仓工具,hive将文件数据映射成结构性数据-表。 了解hive SQL语句hive SQL...
  • Hive语句执行顺序

    2022-08-03 11:03:13
    sql语句执行顺序很重要,不理解它就不知道该如何优化
  • 通过上面的研究我们发现在hivesql中其执行顺序大致如下: from->where(谓词下推)->join->on->select(select中的字段与group by只要不一致就会有)->group by->select(为having准备数据,因而having中可以使用select...
  • hive sql执行顺序

    2021-07-11 17:28:54
    mysql和hivesql执行顺序对比 msyql语句执行顺序 代码写的顺序: select ... from... where.... group by... having... order by.. 或者 from ... select ... 代码的执行顺序: from... where...group by... ...
  • Hive sql常用语句

    2022-06-14 16:04:50
    HIve 常用sql
  • Hive SQL执行顺序

    2021-07-01 14:15:16
    hive 和 mysql 中都可以通过 explain+sql 语句,来查看执行顺序。对于一条标准 sql 语句,它的书写顺序是这样的: select … from … where … group by … having … order by … limit … (1)mysql 语句执行...
  • HiveSQL语句解析流程

    2021-09-29 17:15:30
    流程图地址https://cwiki.apache.org/confluence/display/Hive/Design#Design-HiveArchitecture 一丶上图英文注释 DRIVER---------------->驱动 COMPILER-------------->编译器 METASTORE------------->...
  • 1.from 2.where 3.group by 4.order by 5.limit 6.select
  • HiveSQL语句大全

    2021-07-12 11:07:18
    查询前20%时间的订单信息 Rank 排序 该函数配合OVER()使用 RANK() 排序相同时会重复,总数不会变 DENSE_RANK() 排序相同时会重复,总数会减少 ROW_NUMBER() 会根据顺序计算 假设有如下score表 Regexp_replace 正则...
  • 1、Hive产生背景 MapReduce编程的不便性 ...Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。 由Facebook开源,最初用于解决海量结构化的日志数据统计问题 构建在Hadoop之上的数据仓库 Hive定义了一种
  • SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference 从什么表查 [WHERE where_condition] 过滤 ... [ORDER BY col_list] 排序 统称为hive中4个人 [CLUSTER BY col_list | [DI
  • Hive SQl语句执行

    千次阅读 2017-11-26 19:58:16
    Hive SQL语句执行
  • hive和mysql中都可以通过explain+sql语句,来查看执行顺序。 对于一条标准sql语句,它的书写顺序是这样的: select … from … where … group by … having … order by … limit … (1)mysql语句执行顺序...
  • 注意:from>where>group by>having>select>order by语句执行顺序,对于重命名的部分尤其注意 hive3.1.1新版本可识别,旧版本会报错 例:支付金额排序 错误写法, order by 后不能接原始名字,要写 as 后的 ...
  • 排名/不排名,占位/不占位 hive数据去重,并根据需求取其中一条 数据案例: name adx tran_id cost ts ck 5 125.168.10.0 33.00 1407234660 ck 5 187.18.99.00 33.32 1407234661 ck 5 125.168.10.0 33.24 1407234661...
  • HiveSQL执行效率优化

    2021-05-27 14:54:19
    Hive的优化 ① 工作中针对数据去重...在每次运行Hive语句时,运行最开始之前都会输出一段话: Number of reduce tasks not specified. Estimated from input data size: 1 In order to change the average load for
  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。 HBase(Hadoop Database),是一个高可靠性、高性能、面向...
  • hive sql语句转换成mapreduce 孩子加油孩子 2017-04-28 11:33:52 ...
  • 代码写的顺序: select ... from .a join b. on .. where.... group by... having... order by.. msyql语句执行顺序 : from. join. on . where...group by......hive 语句执行顺序 大致顺序 from...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,040
精华内容 4,016
关键字:

hive sql语句的执行顺序

友情链接: bszbgdm.rar