zoukankan      html  css  js  c++  java
  • 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
    

        

  • 相关阅读:
    java之SpringBoot配置多数据源,使用dynamicdatasourcespringbootstarter和mybatisplusbootstarter,查了很多都不行,就这个可用。
    IntelliJ IDEA——数据库集成工具(Database)的使用
    opencv 截取视频
    linux 环境中cat命令进行关键字搜索
    composer 安装 指定php版本
    【高中经验分享】2021.11.29
    达梦数据库远程网页访问
    BERT代码阅读
    watchdog用于监测系统服务是否挂掉,挂掉则自动重启
    BERT模型+rabbitmq队列,进行实时预测,防止每次预测都重新加载图
  • 原文地址:https://www.cnblogs.com/binguo2008/p/7376626.html
Copyright © 2011-2022 走看看