zoukankan      html  css  js  c++  java
  • HiveQL 与 SQL的异同

    1 select 别名

    (1)别名一定要加as

    例:select ID as stuID

    from students

    (2)

    Hive QL不支持在group by, order by 中使用select 别名,原因是先处理完再select,所以定义在select中的别名无法被group by 使用

    例:

    select weekofyear(date) as week_num, sum(sales_num)

    from sale_data

    group by weekofyear(date) #不可以直接使用week_num

    2 join

    (1)不支持非等值连接

    1)在自助查询平台中我使用过非主键之间的连接,会有提示没有使用主键join,不知道是不是开启了strict模式

    2)在自助查询平台中join需要对表建别名

    select poiid,dealid,date,price,revenue,revenue/price as order_num

    from detail.compdeal_poi_daily) a

    join dim.poi b

    on a.poiid = b.poiid

    (2)支持多表连接

    1) 生成一个MR job

    多表连接,如果多个表中每个表都使用同一个列进行连接(出现在JOIN子句中),则只会生成一个MR Job

    SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)

    三个表a、b、c都分别使用了同一个字段进行连接,亦即同一个字段同时出现在两个JOIN子句中,从而只生成一个MR Job。

    2) 生成多个MR job

    多表连接,如果多表中,其中存在一个表使用了至少2个字段进行连接(同一个表的至少2个列出现在JOIN子句中),则会至少生成2个MR Job

    SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

    三个表基于2个字段进行连接,这两个字段b.key1和b.key2同时出现在b表中。连接的过程是这样的:首先a和b表基于a.key和b.key1进行连接,对应着第一个MR Job;表a和b连接的结果,再和c进行连接,对应着第二个MR Job。   

    3)表连接顺序优化

    多表连接,会转换成多个MR Job,每一个MR Job在Hive中称为JOIN阶段(Stage)。在每一个Stage,按照JOIN顺序中的最后一个表应该尽量是大表,因为JOIN前一阶段生成的数据会存在于Reducer的buffer中,通过stream最后面的表,直接从Reducer的buffer中读取已经缓冲的中间结果数据(这个中间结果数据可能是JOIN顺序中,前面表连接的结果的Key,数据量相对较小,内存开销就小),这样,与后面的大表进行连接时,只需要从buffer中读取缓存的Key,与大表中的指定Key进行连接,速度会更快,也可能避免内存缓冲区溢出。

    4) 基于条件的LEFT OUTER JOIN优化

    左连接时,左表中出现的JOIN字段都保留,右表没有连接上的都为空。对于带WHERE条件的JOIN语句,例如:

          SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)    

          WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'    

    执行顺序是,首先完成2表JOIN,然后再通过WHERE条件进行过滤,这样在JOIN过程中可能会输出大量结果,再对这些结果进行过滤,比较耗时。可以进行优化,将WHERE条件放在ON后,例如:

          SELECT a.val, b.val FROM a LEFT OUTER JOIN b    

          ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07')    

    这样,在JOIN的过程中,就对不满足条件的记录进行了预先过滤,可能会有更好的表现。

    5)左半连接(LEFT SEMI JOIN)

    左半连接实现了类似IN/EXISTS的查询语义,使用关系数据库子查询的方式实现查询,例如一般SQL语句

    SELECT a.key, a.value FROM a WHERE a.key IN (SELECT b.key FROM b);
    在Hive中如下

    SELECT a.key, a.val FROM a LEFT SEMI JOIN b ON (a.key = b.key)
    需要注意的是,在LEFT SEMI JOIN中,表b只能出现在ON子句后面,不能够出现在SELECT和WHERE子句中

    3 order by

    (1) strict模式下需要和limit一起使用

    原因: 在order by 状态下所有数据会到一台服务器进行reduce操作也即只有一个reduce,如果在数据量大的情况下会出现无法输出结果的情况,如果进行 limit n ,那只有  n * map number 条记录而已。只有一个reduce也可以处理过来。

    (2)sort by

    sort by 不受 hive.mapred.mode 是否为strict ,nostrict 的影响。sort by 的数据只能保证在同一reduce中的数据可以按指定字段排序。使用sort by 你可以指定执行的reduce 个数 (set mapred.reduce.tasks=<number>) 这样可以输出更多的数据。对输出的数据再执行归并排序,即可以得到全部结果。

    http://stackoverflow.com/questions/26028767/why-cant-hive-recognize-alias-named-in-select-part

    http://shiyanjun.cn/archives/588.html

    http://blog.csdn.net/mashroomxl/article/details/22091665

    http://metooxi.iteye.com/blog/1447621

  • 相关阅读:
    实时获取阿里旺旺聊天记录,实时获取千牛聊天记录
    千牛hook 旺旺hook,旺旺发消息call,千牛发消息call,千牛机器人,破解旺旺发消息代码,破解千牛发消息代码,反汇编旺旺发消息,反汇编千牛发消息,旺旺发消息组件,千牛发消息组件
    hook千牛 千牛破解发消息 千牛机器人 千牛发消息组件 调用千牛发消息 实时获取千牛聊天记录 可以提供代码
    [转发]分布式事务,这一篇就够了
    C++之throw以及try{}...catch{}【转载】
    C++之Effective C++学习-条款2
    c++中为什么析构函数要被设置为虚函数(virtual)
    c++中在声明静态变量时,使用const可直接初始化,不在需要定义式
    js检测浏览器类型_js检测是否为火狐浏览器
    PHP8.0 JIT 配置
  • 原文地址:https://www.cnblogs.com/yxzfscg/p/4892124.html
Copyright © 2011-2022 走看看