zoukankan      html  css  js  c++  java
  • hive 包含操作(left semi join)(left outer join = in)迪卡尔积

    目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现。

    假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注册用户,字段只有一个uid),这两个表都包含一个字段,uid。

     

    in查询

    如果要查询当天登陆的注册用户,需要用in查询,hive sql如下:

    select login.uid from login left outer join regusers on login.uid=regusers.uid where regusers.uid is not null

    如果login表和regusers表按天分区,字段是dt,那么查询2013年1月1号当天登陆的注册用户,hive sql如下:

    select login.uid from login day_login left outer join 
       (select uid from regusers where dt='20130101') day_regusers
    on day_login.uid=day_regusers.uid where day_login.dt='20130101' and day_regusers.uid is not null

     

    not in查询

    如果要查询当天登陆的老用户(这里假设非当天注册用户就是老用户),需要用not in查询,hive sql如下:

    select login.uid from login left outer join regusers on login.uid=regusers.uid where regusers.uid is null;

    如果login表和regusers表按天分区,字段是dt,那么查询2013年1月1号当天登陆的老用户,hive sql如下:

    select login.uid from login day_login left outer join 
       (select uid from regusers where dt='20130101') day_regusers
    on day_login.uid=day_regusers.uid where day_login.dt='20130101' and day_regusers.uid is null;

     


    LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现。

    Hive 当前没有实现 IN/EXISTS 子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 

     

    ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

     

      SELECT a.key, a.value

      FROM a

      WHERE a.key in

       (SELECT b.key

        FROM B);

    可以被重写为:

       SELECT a.key, a.val

       FROM a LEFT SEMI JOIN b on (a.key = b.key)


    笛卡尔积

    Hive本身是不支持笛卡尔积的,不能用select T1.*, T2.* from table_1, table_2这种语法。但有时候确实需要用到笛卡尔积的时候,可以用下面的语法来实现同样的效果:

    select T1.*, T2.* from (select * from table1) T1 join (select * from table2) T2 on 1=1;

    其中on 1=1是可选的,注意在Hive的Strict模式下不能用这种语法,需要先用set hive.mapred.mode=nonstrict;设为非strict模式就可以用了。

  • 相关阅读:
    HDU
    P2458 [SDOI2006]保安站岗[树形dp]
    POJ 2155 Matrix[树状数组+差分]
    P1281 书的复制[二分]
    【清北学堂】广州OI学习游记
    P1736 创意吃鱼法[二维dp]
    P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
    P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
    P1273 有线电视网[分组背包+树形dp]
    windows下安装MySQL
  • 原文地址:https://www.cnblogs.com/charlist/p/7122136.html
Copyright © 2011-2022 走看看